Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让ssh从stdin接收密码_Ssh_Passwords_Stdin - Fatal编程技术网

如何让ssh从stdin接收密码

如何让ssh从stdin接收密码,ssh,passwords,stdin,Ssh,Passwords,Stdin,如何让SSH从stdin读取密码(默认情况下不会这样做?建议使用该库 但是,如果您需要编程式ssh登录,您确实应该这样做——显然,与使用外部库通过stdin传递密码相比,这种方式的安全漏洞要少得多。大多数ssh客户端都无法做到这一点。您可以使用sshapi来解决这个问题,就像Python一样。小心不要否决所有安全策略。旧的恢复后 我在寻找完全相同问题的解决方案时发现了这一点,我发现了一些东西,我希望有一天有人会发现它有用: 安装ssh-askpass程序(apt-get、yum…) 设置SSH\

如何让SSH从stdin读取密码(默认情况下不会这样做?

建议使用该库


但是,如果您需要编程式ssh登录,您确实应该这样做——显然,与使用外部库通过stdin传递密码相比,这种方式的安全漏洞要少得多。大多数ssh客户端都无法做到这一点。您可以使用sshapi来解决这个问题,就像Python一样。小心不要否决所有安全策略。

旧的恢复后

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

  • 安装ssh-askpass程序(apt-get、yum…)
  • 设置
    SSH\u ASKPASS
    变量(
    export SSH\u ASKPASS=/usr/bin/SSH ASKPASS
  • 从终端打开一个没有未定义终端变量(
    setsid ssh)的新ssh连接user@host
  • 这看起来足够简单,可以确保安全,但尚未检查(仅在本地安全上下文中使用)

    我们到了。

    基于此,您可以执行以下操作:

    创建一个命令,使用ssh\u ASKPASS打开ssh会话(打开seek ssh\u ASKPASS)

    使它们可执行

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

    $ ./ssh_session
    
    请记住,ssh代表secure shell,如果您将用户、主机和密码存储在纯文本文件中,则会误导该工具,从而造成可能的安全漏洞,例如在Official中。例如:

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

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

    它允许您在计算机上拥有一个专用RSA密钥,在服务器上拥有一个公用RSA密钥,从而无需使用密码即可登录到服务器

    提取留下一个简单而通用的脚本:

    #!/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\u ASKPASS
    程序后启动显示的内容


    ssh
    同时遇到
    ssh\u ASKPASS
    DISPLAY
    set时,它将启动
    ssh\u ASKPASS
    引用的程序,并向其传递提示
    user@host的密码:

    更好的
    sshpass
    替代方案是:


    我的
    sshpass
    有问题,如果没有将ssh服务器添加到我的
    known_主机中
    sshpass
    不会向我显示任何消息,
    passh
    没有这个问题。

    另一个要求是必须设置显示。如果您正在运行X,则不会注意到。如果你不是,你会的。为了使上面的ssh_脚本更具可移植性,添加以下内容:export DISPLAY;DISPLAY=dummy(或者如果您没有setsid)-除了设置DISPLAY和SSH_ASKPASS之外,您可能还需要从/dev/null引导STDIN,以使SSH add确信它不在终端上:SSH add/path/to/keypass获取密码短语,为了给
    ssh添加
    ,以一种通用的方式,根据需要生成askpass脚本。是否有人可以更新解决方案以采纳评论中的建议?相关:如果您以前没有通过ssh访问此主机,您可能还需要将
    -oStrictHostKeyChecking=no
    传递到
    ssh
    命令;否则,它将提示用户是否信任未知的主机密钥。显然,只有当您确信您信任未知的主机密钥时,才可以这样做。遗憾的是,这是我使用的唯一解决方案,对于ssh jumphosts来说并不太好。另一种选择是
    expect
    ,我猜这比它的工作更麻烦。自制软件(macOS)已经禁止了它:(“我们不会添加sshpass,因为它让SSH新手用户很容易破坏SSH的安全性。”你知道为什么它不起作用吗?直觉上它应该起作用。它不应该起作用,因为这会激发初级系统管理员使用SSH密码编写脚本,而SSH密码则纠缠在脚本的逻辑中。在网络和系统管理环境中,一方面需要将安全敏感信息与安全敏感信息明确分开另一方面,密码验证还不够安全。由于ssh在系统管理上下文中被广泛使用,因此尝试让用户远离仅使用密码的安全性是一个好主意。
    #!/bin/bash
    [[ $1 =~ password: ]] && cat || SSH_ASKPASS="$0" DISPLAY=nothing:0 exec setsid "$@"
    
    $ echo mypass | pass ssh user@host ...