【问题标题】:How to input automatically when running a shell over SSH?通过 SSH 运行 shell 时如何自动输入?
【发布时间】:2012-02-22 22:22:26
【问题描述】:

在我的 shell 脚本中,我正在运行一个要求我输入的命令。

如何自动为命令提供所需的输入?

例如:

$cat test.sh
ssh-copy-id tester@10.1.2.3

运行 test.sh 时:

  • 首先,它会问:

    Are you sure you want to continue connecting (yes/no)?

  • 然后,它会要求我输入密码:

    tester@10.1.2.3's password:

有没有办法自动输入?

【问题讨论】:

    标签: shell ssh


    【解决方案1】:

    对于简单的输入,例如两个提示和两个对应的固定响应,您还可以使用“这里文档”,其语法如下所示:

    test.sh <<!
    y
    pasword
    !
    

    【讨论】:

    • 我收回来,ssh 通过 tty 设备提示,它绕过了标准输入。用 Emily Litella 的话来说,“没关系”。 :)
    • 唉!在浪费了几个小时之后......找到了最好的解决方案,谢谢。
    • 标题未指定 SSH,因此虽然这不适用于 OP,但发现问题的其他人可能需要并使用此答案。顺便说一句,这里的字符串语法——&lt;&lt;&lt;$'y\npasword'——也可能对其他人有用。
    【解决方案2】:

    对于一般的命令行自动化,Expect 是经典工具。或者,如果您更熟悉 Python,请尝试 pexpect

    这里有一个类似的问题,建议使用 Expect:Use expect in bash script to provide password to SSH command

    【讨论】:

    • 我们真的应该停止宣传 expect 作为一种自动化 ssh 的方式。 SSH 故意使这些提示难以自动化,以促使我们使用正确的解决方案:命令行标志绕过确认和公钥/私钥消除密码提示。
    • 这很理想,但现实世界往往并不理想。对于提出的问题,这是典型的方法。如果您使用密钥,您可能也需要密钥上的密码,然后您很可能处于相同的情况。当然,您可以ssh-agentkeychain 等,但有时会有不方便或不切实际的原因。
    【解决方案3】:

    肯定有……使用 spawn、expect 和 send 命令:

    spawn test.sh
    expect "Are you sure you want to continue connecting (yes/no)?"
    send "yes"
    

    Stack Overflow 上还有更多示例,请参阅: Help with Expect within a bash script

    您可能需要先安装这些命令,具体取决于您的系统。

    【讨论】:

    • 我们真的应该停止宣传 expect 作为自动化 ssh 的一种方式。 SSH 故意使这些提示难以自动化,以促使我们使用正确的解决方案:命令行标志绕过确认和公钥/私钥消除密码提示。
    • 如果是第 3 方脚本,并且命令行标志不可用怎么办?
    • @HarshVerma 答案没有警告或警告,所以我坚持我的评论。
    【解决方案4】:

    ssh-key with passphrase, with keychain

    keychain 是一个小型实用程序,它代表您管理 ssh-agent 并允许 ssh-agent 在登录会话结束时保持运行。在后续登录时,钥匙串将连接到现有的 ssh-agent 实例。实际上,这意味着密码只能在重新启动后的第一次登录时输入。在后续登录时,将使用来自现有 ssh-agent 实例的未加密密钥。这对于在没有无密码 ssh 密钥的 cron 作业中允许无密码 RSA/DSA 身份验证也很有用。

    要启用钥匙串,请安装它并将以下内容添加到 ~/.bash_profile:

    评估keychain --agents ssh --eval id_rsa 从安全的角度来看,ssh-ident 和 keychain 不如 ssh-agent 实例受限于特定会话的生命周期,但它们提供了高度的便利性。为了提高钥匙串的安全性,有些人在他们的 ~/.bash_profile 钥匙串调用中添加了 --clear 选项。通过这样做,必须如上所述在登录时重新输入密码,但 cron 作业在用户注销后仍然可以访问未加密的密钥。钥匙串 wiki 页面有更多信息和示例。

    此信息来自;

    https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt

    希望对你有帮助

    我个人可以通过执行以下操作在终端启动时自动输入我的密码:(当然,您可以修改脚本并使其适合您的需要)

    1. 编辑 bashrc 文件以添加此脚本;

      检查 SSH 代理是否处于唤醒状态

      如果 [ -z "$SSH_AUTH_SOCK" ] ;然后 exec ssh-agent bash -c "ssh-add ; $0" echo "SSH 代理被唤醒" 出口 菲

      上面的行将在终端启动时启动期望脚本。

      ./ssh.exp

    这是这个期望脚本的内容

    #!/usr/bin/expect
    
    set timeout 20
    
    set passphrase "test"
    
    spawn "./keyadding.sh"
    
    expect "Enter passphrase for /the/path/of/yourkey_id_rsa:"
    
    send "$passphrase\r";
    
    interact
    

    这是我的 keyadding.sh 脚本的内容(您必须将两个脚本都放在您的主文件夹中,通常是 /home/user)

    #!/bin/bash
    
    ssh-add /the/path/of/yourkey_id_rsa
    
    exit 0
    

    我强烈建议对 .exp 脚本上的密码进行加密,并将此 .exp 文件重命名为 term_boot.exp 或其他任何内容以确保安全。不要忘记创建使用 nano 或 vim 直接从终端(例如:nano ~/.bashrc | nano term_boot.exp)以及chmod +x script.sh 使其可执行文件。 chmod +r term_boot.exp 也很有用,但您必须在 bashrc 文件中的 ./ssh.exp 之前添加 sudo。因此,每次启动终端时都必须输入 sudo 密码。对我来说,它比密码更方便,因为我记得我的管理员(sudo)密码。

    另外,我认为还有另一种方法; https://www.cyberciti.biz/faq/noninteractive-shell-script-ssh-password-provider/

    如果我有时间,肯定会改变我的方法。

    【讨论】:

      【解决方案5】:

      您还可以将答案传递给脚本:

      printf "y\npassword\n" | sh test.sh
      

      \n 是转义序列

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-25
        • 2017-03-31
        • 2013-01-09
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        • 1970-01-01
        • 2017-10-11
        相关资源
        最近更新 更多