[英]Can't get bash script to answer prompt with expect
我的ssh访问仅限于Google身份验证器验证码提示。 我想要一个以编程方式回答该提示的脚本。
背景 :
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"
谢谢
有一些问题:
拥有密码有参数可以通过简单的方式向其他用户显示您的密码
ps axw
将密码存储到变量中可以通过简单的方式向其他用户显示您的密码
ps axeww
通过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.