如何使用 expect 向 ssh 连接发送密码。
说密码是 p@ssword 并且 ssh 命令是 ssh me@127.0.0.1
当它说时,我会怎么做才能让它输入密码
me@127.0.0.1的密码:
?
使用 SSH 密钥对的正确操作不是一个选项,因为我必须使用 ssh (scp) 将密钥放在服务器上,这会要求输入密码。
我总是使用“正确”的解决方案,但我在其他情况下使用了 expect。
在这里,我发现了以下建议:
#!/usr/local/bin/expect
spawn sftp -b cmdFile user@yourserver.com
expect "password:"
send "shhh!\n";
interact
使用公钥认证和使用没有密码的密钥不是更容易吗?
当源计算机上的用户执行此操作以生成 RSA 密钥
ssh-keygen -t rsa
现在将 ~/.ssh/id_rsa.pub 复制到目标机器并将其附加到目标用户的 authorized_keys 文件中
您最快的前进方式(除非您想成为 Tcl 专家,这在 2009 年将是……不寻常的……)可能是使用autoexpect
. 这是手册页:
http://expect.nist.gov/example/autoexpect.man.html
简而言之,启动autoexpect
,运行你的 ssh 会话,完成你需要做的事情,停止自动预期,然后敲打你的键盘,直到它工作为止:) 我假设你只需要一个快速的 hack把你的钥匙整理好,然后,听起来你已经知道分数了。
还有这个问题已经包含一个接近你所寻求的例子。
Cygwin 有 autoexpect 只是不在 bin 包中。运行 setup.exe 并搜索 expect 并选中源复选框。您将在 /usr/src 中看到生成的树,其中有一个 expect/expect/examples 目录。里面有一个 autoexpect 脚本的副本。
密钥解决方案将不起作用......因为密钥只能由运行 ssh 的人读取。在 xp 上,您无法创建具有正确权限的密钥结构。所以 ssh 不会读取它们。这可能已经改变,但最后我检查它仍然无法正常工作。
我很确定不可能做你想做的事情。大多数提示输入密码的 *nix 应用程序直接从 TTY 读取,而不是 stdin,因此您无法输入密码。正如其他人所提到的,您可以将 SSH 配置为不提示输入密码,如此处所述。
在我无缘无故被否决后,我去对该expect
命令进行了更多研究,发现它有一个send_tty
发送到 /dev/tty 而不是 stdin 的命令,它实际上可能会做你想要的......我是以前不知道这个功能。但是,我仍然建议将密钥放在服务器上。