【问题标题】:How to make ssh receive the password from stdin如何让 ssh 从 stdin 接收密码
【发布时间】:2010-11-23 08:17:54
【问题描述】:

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

【问题讨论】:

标签: ssh passwords stdin


【解决方案1】:

基于此post,您可以这样做:

使用 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,如果您将用户、主机和密码存储在纯文本文件中,您会误导该工具并造成可能的安全漏洞

【讨论】:

  • 另一个要求是必须设置 DISPLAY。如果您正在运行 X,您将不会注意到。如果你不是,你会的。为了使上面的 ssh_script 更便携,添加这个:export DISPLAY; DISPLAY=虚拟
  • 进一步(或者如果你没有 setsid) - 除了设置 DISPLAY 和 SSH_ASKPASS,你可能还需要从 /dev/null 引导 STDIN 以说服 ssh-add 它不在终端:ssh-add /path/to/key
  • 我使用这个想法从pass 获取密码,以通用方式提供给ssh-add,根据需要生成askpass 脚本。 milosophical.me/blog/2018/ssh-pass.html
  • 有人可以更新解决方案以采纳 cmets 的建议吗?
【解决方案2】:

您可以使用sshpass,例如官方的debian repositories。示例:

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

【讨论】:

  • 遗憾的是,这是我使用的唯一解决方案,这对于 ssh 跳转主机来说不是很好。另一种选择是expect,我猜这比工作更麻烦。
  • Homebrew (macOS) 已禁止它:(“我们不会添加 sshpass,因为它使 SSH 新手很容易破坏 SSH 的安全性。”
【解决方案3】:

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

【讨论】:

  • 知道为什么它不起作用吗?直觉上应该。
  • 它不应该起作用,因为这会激发初级系统管理员编写脚本,并将 SSH 密码与脚本中的逻辑纠缠在一起。在网络和系统管理环境中,一方面需要明确区分安全敏感信息,另一方面需要完成任务。密码身份验证不够安全。由于 ssh 在系统管理员上下文中广泛使用,因此尝试让用户远离仅密码的安全性是一个好主意。
【解决方案4】:

蒸馏this answer 留下一个简单而通用的脚本:

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

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

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

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

当ssh同时遇到SSH_ASKPASS和DISPLAY集合时,它将启动SSH_ASKPASS引用的程序,并传递给它提示user@host's password:

【讨论】:

  • 如果您之前没有通过 SSH 连接到此主机,您可能还需要将 -oStrictHostKeyChecking=no 传递给 ssh 命令;否则会提示用户是否信任未知的主机密钥。显然,只有在您确定您信任未知的主机密钥时才这样做。
【解决方案5】:

FreeBSD mailing list 推荐 expect 库。

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

【讨论】:

    【解决方案6】:

    旧帖复活了……

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

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

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

    我们到了。

    【讨论】:

      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

        更好的sshpass 替代方案是: https://github.com/clarkwang/passh

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-17
          • 2013-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-13
          • 2021-05-12
          相关资源
          最近更新 更多