有没有办法自动将密码传递给ssh。我想自动ssh到服务器没有使用公钥认证或期望脚本,通过某种方式获取ssh从stdin或文件中读取密码。
它必须是这样的原因是我想使用作为cron作业运行的rsync / ssh将我的文件备份到服务器。此服务器在对我进行身份验证后安装我的主目录,因此使用公钥身份验证不起作用,因为〜/ .ssh在登录成功后才可用。 expect(1)是不可能的,因为我想将它作为一个cron作业运行,并且由于cron作业不在终端下运行,所以expect / ssh的组合不起作用。我没有对该服务器的root访问权限,并且很难让管理员对工作方式进行任何更改。
答案 0 :(得分:7)
期望是不可能的,因为我想将它作为一个cron工作运行, 并且由于cron作业不在终端下运行expect / ssh的组合 只是不起作用
你可以运行来自cron的expect脚本,至少你可以期待像Python的“pexpect”这样的库。我刚刚对此进行了测试以确认,从cron运行pexpect scp / ssh脚本,我能够成功地从运行在cron中的Python脚本中scp一个文件。
示例代码:
#!/usr/bin/python
import pexpect
FILE="/path/to/file"
REMOTE_FILE=""
USER="user"
HOST="example.com"
PASS="mypass"
COMMAND="scp -oPubKeyAuthentication=no %s %s@%s:%s" % (FILE, USER, HOST, REMOTE_FILE)
child = pexpect.spawn(COMMAND)
child.expect('password:')
child.sendline(PASS)
child.expect(pexpect.EOF)
print child.before
答案 1 :(得分:2)
使用sshpass
。
例如,当密码在password.txt
文件中时:
sshpass -fpassword.txt ssh username@hostname
(摘自similar question的答案)
答案 2 :(得分:1)
使用公钥/私钥系统而不是传递密码。将计算机的公钥添加到要连接的所有计算机上的授权密钥列表中。使用此方法,SSH可以自动验证密钥,无需密码。
您可以在此处找到说明:http://linuxproblem.org/art_9.html
由于我只是更仔细地阅读了这个问题,您可能希望环顾一下支持密码身份验证的不同SSH客户端而无需用户交互。我快速谷歌搜索暗示他们存在(http://www.derkeiler.com/Newsgroups/comp.security.ssh/2004-12/0134.html)
相关的Stackoverflow问题:
答案 3 :(得分:0)
答案 4 :(得分:0)
SSH要求“信念的飞跃”以确保最初的握手能够防止未来的篡改。 (您最初信任服务器为您提供的密钥)
目前可用但不是众所周知的方法是使用SSH-SRP。这使用相互密码知识对您进行身份验证并提供安全加密ssh会话所需的会话加密密钥。
它比SSH最初的“信任我”更安全,并且不需要长期存储密钥。
答案 5 :(得分:-1)
请勿使用expect,pexpect等提供密码。如果你这样做,你的密码必须在明文的某个地方,这实际上可以比使用无密码的公钥/私钥对更安全安全。这是更多的工作!
从“SSH:The Definitive Guide”中阅读本页,以了解您的选择: http://www.snailbook.com/faq/no-passphrase.auto.html
答案 6 :(得分:-2)
您误解了公钥认证的工作原理。您不需要访问远程主目录,只需将本地公钥放在远程authorized_keys
文件中即可。有一个谷歌周围,有很多指南。