不使用公钥认证或期望自动化SSH(1)

时间:2008-11-07 02:45:07

标签: authentication scripting ssh passwords expect

有没有办法自动将密码传递给ssh。我想自动ssh到服务器没有使用公钥认证或期望脚本,通过某种方式获取ssh从stdin或文件中读取密码。

它必须是这样的原因是我想使用作为cron作业运行的rsync / ssh将我的文件备份到服务器。此服务器在对我进行身份验证后安装我的主目录,因此使用公钥身份验证不起作用,因为〜/ .ssh在登录成功后才可用。 expect(1)是不可能的,因为我想将它作为一个cron作业运行,并且由于cron作业不在终端下运行,所以expect / ssh的组合不起作用。我没有对该服务器的root访问权限,并且很难让管理员对工作方式进行任何更改。

7 个答案:

答案 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)

本讨论讨论了您要做的事情:

http://cygwin.com/ml/cygwin/2004-02/msg01449.html

如果你不能让admin为你创建一个本地目录,那么这将不起作用。

答案 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文件中即可。有一个谷歌周围,有很多指南。