30

如何让 SSH 从标准输入读取密码,默认情况下它不会这样做?

4

8 回答 8

23

根据这篇文章,您可以执行以下操作:

创建一个使用SSH_ASKPASS打开 ssh 会话的命令(在man ssh上查找 SSH_ASKPASS )

$ cat > ssh_session <<EOF
export SSH_ASKPASS="/path/to/script_returning_pass"
setsid ssh "your_user"@"your_host"
EOF

注意:为了避免 ssh 尝试在 tty 上询问,我们使用setsid

创建一个返回密码的脚本(注意echo "echo

$ echo "echo your_ssh_password" > /path/to/script_returning_pass

使它们可执行

$ chmod +x ssh_session
$ chmod +x /path/to/script_returning_pass

尝试一下

$ ./ssh_session

请记住,ssh 代表安全 shell,如果您将用户、主机和密码存储在纯文本文件中,您会误导该工具并造成可能的安全漏洞

于 2013-02-26T13:35:35.547 回答
14

您可以使用官方debian 存储库中的sshpass。例子:

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
于 2014-07-10T14:16:59.543 回答
10

您不能使用大多数 SSH 客户端。您可以通过使用 SSH API 来解决它,例如用于 Python的Paramiko 。注意不要推翻所有安全策略。

于 2009-08-27T11:14:52.180 回答
6

提炼这个答案会留下一个简单而通用的脚本:

#!/bin/bash
[[ $1 =~ password: ]] && cat || SSH_ASKPASS="$0" DISPLAY=nothing:0 exec setsid "$@"

将其另存为pass,执行 a chmod +x pass,然后像这样使用它:

$ echo mypass | pass ssh user@host ...

如果它的第一个参数包含password:,那么它将其输入传递给它的输出(cat),否则它启动在将自己设置为SSH_ASKPASS程序之后呈现的任何内容。

ssh同时遇到SSH_ASKPASSANDDISPLAY设置时,它会启动由 引用的程序SSH_ASKPASS,并传递给它提示user@host's password:

于 2017-03-22T16:35:16.430 回答
4

FreeBSD 邮件列表推荐了expect库。

如果您需要编程 ssh 登录,那么您确实应该使用公钥登录,但是 - 与使用外部库传递密码相比,这种方式的安全漏洞显然要少得多stdin

于 2009-08-27T11:12:31.747 回答
4

旧帖复活...

我在寻找完全相同的问题的解决方案时发现了这个,我发现了一些东西,我希望有一天有人会发现它有用:

  1. 安装ssh-askpass程序 (apt-get, yum ...)
  2. 设置SSH_ASKPASS变量 ( export SSH_ASKPASS=/usr/bin/ssh-askpass)
  3. 从终端打开一个没有未定义的 TERMINAL 变量 ( setsid ssh user@host)的新 ssh 连接

这看起来很简单,可以确保安全,但尚未检查(仅在本地安全上下文中使用)。

我们到了。

于 2011-07-26T19:41:13.107 回答
2

我不确定您需要此功能的原因,但您似乎可以使用 ssh-keygen 获得此行为。

它允许您通过在您的计算机上拥有私有 RSA 密钥和在服务器上拥有公共 RSA 密钥而无需使用密码登录到服务器。

http://www.linuxproblem.org/art_9.html

于 2014-07-12T02:47:51.673 回答
2

更好的sshpass选择是: https ://github.com/clarkwang/passh

我遇到了问题sshpass,如果 ssh 服务器未添加到我known_hosts sshpass将不会显示任何消息,passh则没有此问题。

于 2020-01-11T18:00:44.653 回答