无法获得bash脚本以期待回答提示

问题描述 投票:4回答:3

我的ssh访问仅限于Google身份验证器验证码提示。我想要一个以编程方式回答该提示的脚本。

语境:

  • 变量($ 1)正确传递给脚本 - 这是验证码。
  • sshfs命令在终端中工作。
  • 提示Verification code:最后带有空格和一个关键符号。

[编辑]为了确保我们不在此处切换到安全性讨论,请注意我当然也使用SSH密钥,此外还有Google身份验证器。由于Authenticator验证码每x秒到期,其他人可以拦截它并不重要。

结果:

磁盘安装(我可以用df -h看到它),但是是空的......有类似的行为,如验证代码错误,或者它没有时间执行?

Shell脚本:

    #!/bin/bash

    expect_sh=$(expect -c "
        spawn /usr/local/bin/sshfs [email protected]:/path/to/folder/RAID1 /Users/username/Desktop/RAID1 -o defer_permissions -o volname=RAID1
        expect \"Verification code:\"
        send \"$1\r\";
    ")

    echo "$expect_sh"

谢谢

bash shell expect
3个回答
3
投票

I'm afraid, I have to answer no.

有一些问题:

  1. 拥有密码有参数可以通过简单的方式向其他用户显示您的密码 ps axw
  2. 将密码存储到变量中可以通过简单的方式向其他用户显示您的密码 ps axeww
  3. 通过qazxsw poi传输密码很容易追踪。

由于这个原因以及其他许多原因,STDIN(和ssh)拒绝通过参数,变量或sftp传递秘密。

在要求输入密码之前,需要进行大量验证,然后使用安全对话框(使用直接TTY或X DISPLAY上的某些框)。

因此使用STDIO或使用expect或传递秘密作为参数是不可能的。

但。

您可以使用密钥连接ssh服务器:

ssh

那么现在,你必须发送你的ssh-keygen -b 4096 Enter file in which to save the key (/home/user/.ssh/id_rsa): Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_rsa. Your public key has been saved in /home/user/.ssh/id_rsa.pub. The key fingerprint is: SHA256:q/2fX/Hello/World/Lorem/Ipsum/Dolor/Sit/Amet user@localhst The key's randomart image is: +---[RSA 4096]----+ | .=o=E.o| | .. o= o | | o+ +=... | | .o+ o+o. | | . +.oS.oo | | . *.= . ... | | o =. oo. | | ... +o. | | .ooo oooo.| +----[SHA256]-----+ 存储在你尝试连接的服务器的/home/user/.ssh/id_rsa.pub文件中(这些文件位于authorized_keys$HOME/.ssh/,但可能位于其他位置,具体取决于服务器中的/etc)。


2
投票

这不起作用的原因是你在命令替换中的子shell中运行sshd.conf

如果你不希望并希望这个过程保持活力,这将是一个定期无害的expect

只需取出变量捕获并运行useless use of echo作为当前脚本的直接后代。如果您真的要求输出在变量完成时可用作变量,可以尝试类似的东西

expect

0
投票

你可以用屏幕构建一个解决方案(1)

我测试了下面的脚本。它不是特别强大,你需要根据你的环境做一些改变。

#!/bin/bash

t=$(mktemp -t gauthssh.XXXXXXXXXX) || exit
trap 'rm -f "$t"' EXIT ERROR INT HUP TERM  # clean up temp file when done
expect -c "
    spawn /usr/local/bin/sshfs [email protected]:/path/to/folder/RAID1 /Users/username/Desktop/RAID1 -o defer_permissions -o volname=RAID1
    expect \"Verification code:\"
    send \"$1\r\";
" | tee "$t"
expect_sh=$(<"$t")

我们的想法是设置一个运行命令的屏幕,将其输出重定向到本地文件。然后在循环中获取屏幕抓取并使用grep查找预期的提示。找到后,在屏幕上使用'stuff'命令将密码输入终端输入(即屏幕的pty)。然后你等一下,如果需要的话收集你的输出。这只是概念代码的证明,一个强大的解决方案可以进行更多的错误检查和清理,并等待屏幕实际退出。

© www.soinside.com 2019 - 2024. All rights reserved.