繁体   English   中英

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

[英]Can't get bash script to answer prompt with expect

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

背景

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

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

结果

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

Shell脚本

    #!/bin/bash

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

    echo "$expect_sh"

谢谢

我害怕,我必须回答

有一些问题:

  1. 拥有密码有参数可以通过简单的方式向其他用户显示您的密码

     ps axw 
  2. 将密码存储到变量中可以通过简单的方式向其他用户显示您的密码

     ps axeww 
  3. 通过STDIN传输密码可以很容易追踪。

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

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

因此,使用ssh不能直接使用expect或pass secret作为参数。

但。

您可以使用密钥连接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 ,但可能位于其他地方,具体取决于服务器中的sshd.conf

这不起作用的原因是您在命令替换中的子shell中运行expect

如果不是因为你希望并期望这个过程保持活力,那么这将是一种常规无害的无用的echo

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

#!/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 username@123.123.1.123:/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")

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

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

#!/bin/sh

screen -d -m -S sshtest sh -c "ssh -l postgres localhost id > output"

pass="77c94046"
ret="$(printf '\n')"

while true; do
        screen -S sshtest -X hardcopy
        grep -q 'password:' hardcopy.0 && break
        sleep 1
done

grep -v '^$' hardcopy.0
echo -n "$passenter" | xxd
screen -S sshtest -X stuff "$pass"
screen -S sshtest -X stuff "$(printf '\r')"
sleep 1
cat output

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM