我的ssh访问仅限于Google身份验证器验证码提示。我想要一个以编程方式回答该提示的脚本。
语境:
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"
谢谢
有一些问题:
ps axw
ps axeww
由于这个原因以及其他许多原因,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
)。
这不起作用的原因是你在命令替换中的子shell中运行sshd.conf
。
如果你不希望并希望这个过程保持活力,这将是一个定期无害的expect
。
只需取出变量捕获并运行useless use of echo
作为当前脚本的直接后代。如果您真的要求输出在变量完成时可用作变量,可以尝试类似的东西
expect
你可以用屏幕构建一个解决方案(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)。然后你等一下,如果需要的话收集你的输出。这只是概念代码的证明,一个强大的解决方案可以进行更多的错误检查和清理,并等待屏幕实际退出。