4

有没有办法自动将密码传递给 ssh。我想通过某种方式让 ssh 从标准输入或文件中读取密码,从而在使用公钥身份验证或期望脚本的情况下自动 ssh 到服务器。

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

4

7 回答 7

7

expect 是不可能的,因为我想将它作为 cron 作业运行,并且由于 cron 作业不在终端下运行,expect/ssh 的组合不起作用

您可以从 cron 运行期望脚本,至少您可以使用 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
于 2008-12-12T17:30:16.080 回答
3

使用sshpass.

例如,当密码在password.txt文件中时:

sshpass -fpassword.txt ssh username@hostname

(取自类似问题的答案)

于 2013-12-23T17:41:50.777 回答
1

与其传递您的密码,不如使用公钥/私钥系统。将机器的公钥添加到您要连接的所有机器上的授权密钥列表中。使用这种方法 SSH 可以自动验证密钥,不需要密码。

你可以在这里找到说明:http: //linuxproblem.org/art_9.html

由于我只是更仔细地阅读了这个问题,您可能想四处寻找一个支持密码身份验证而无需用户交互的不同 SSH 客户端。我快速谷歌搜索暗示它们存在(http://www.derkeiler.com/Newsgroups/comp.security.ssh/2004-12/0134.html

相关的 Stackoverflow 问题:

于 2008-11-07T02:48:36.310 回答
0

该讨论讨论了您要执行的操作:

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

如果您不能让管理员为您创建本地目录,那么这将不起作用。

于 2008-11-07T06:00:48.450 回答
0

SSH 需要“信心的飞跃”来确保初始握手免受未来篡改。(您最初信任服务器给您的密钥)

当前可用但不为人所知的一种方法是使用 SSH-SRP。这使用相互密码知识来验证您的身份并提供安全加密您的 ssh 会话所需的会话加密密钥。

它比 SSH 最初的“相信我”要安全得多,并且不需要长期存储密钥。

于 2008-11-30T00:41:21.173 回答
-1

不要使用expect、pexpect 等来输入密码。如果你这样做,你的密码必须是明文的,这实际上可能不如使用无密码的公钥/私钥对安全。这是更多的工作!

阅读“SSH:权威指南”中的此页面以讨论您的选择: http ://www.snailbook.com/faq/no-passphrase.auto.html

于 2009-07-13T19:10:25.180 回答
-2

您误解了公钥身份验证的工作原理。您不需要访问远程主目录,只需将本地公钥放在远程authorized_keys文件中即可。google一下,有很多攻略。

于 2008-11-07T02:56:41.410 回答