如何在SSH上运行shell时自动输入?

如何在SSH上运行shell时自动输入?,shell,ssh,Shell,Ssh,在我的shell脚本中,我正在运行一个命令,请求输入 如何自动为命令提供所需的输入 例如: $cat test.sh ssh-copy-id tester@10.1.2.3 运行test.sh时: 首先,它会问: 是否确实要继续连接(是/否)? 然后,它会要求我输入密码: tester@10.1.2.3的密码: 有办法自动输入吗?对于一般的命令行自动化,这是一个经典的工具。如果您对Python更熟悉,也可以尝试一下 这里有一个类似的问题,建议使用Expect:肯定有。。。使用spawn、e

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

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

例如:

$cat test.sh
ssh-copy-id tester@10.1.2.3
运行test.sh时:

  • 首先,它会问:

    是否确实要继续连接(是/否)?

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

    tester@10.1.2.3的密码:


有办法自动输入吗?

对于一般的命令行自动化,这是一个经典的工具。如果您对Python更熟悉,也可以尝试一下


这里有一个类似的问题,建议使用Expect:

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

spawn test.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
还有更多关于堆栈溢出的示例,请参见:


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

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

test.sh <<!
y
pasword
!
test.sh

带有密码短语和密钥链的ssh密钥

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

要启用keychain,请安装它并将以下内容添加到~/.bash_配置文件中:

eval
keychain--agent ssh--eval id\u rsa
从安全性的角度来看,ssh ident和keychain比限制在特定会话生命周期内的ssh代理实例更糟糕,但它们提供了高度的便利性。为了提高keychain的安全性,有些人在~/.bash_概要文件keychain调用中添加了--clear选项。通过执行此操作,必须如上所述在登录时重新输入密码短语,但是在用户注销后,cron作业仍然可以访问未加密的密钥。keychain wiki页面提供了更多信息和示例

从中获得此信息

希望这有帮助

通过这样做,我个人能够在终端启动时自动输入我的密码:(当然,您可以修改脚本并使其适合您的需要)

  • 编辑bashrc文件以添加此脚本

    检查SSH代理是否已唤醒 如果[-z“$SSH_AUTH_SOCK”];然后 exec ssh代理bash-c“ssh add;$0” echo“SSH代理已被唤醒” 出口 fi

    上面的行将在终端启动时启动expect脚本。 ./ssh.exp

  • 以下是expect脚本的内容

    #!/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
    
    下面是my keyadding.sh脚本的内容(您必须将这两个脚本都放在主文件夹中,通常是/home/user)

    为了安全起见,我强烈建议对.exp脚本上的密码进行加密,并将此.exp文件重命名为term_boot.exp或其他任何形式。不要忘记使用nano或vim直接从终端创建文件(例如:
    nano~/.bashrc | nano term_boot.exp
    )还有一个
    chmod+xscript.sh
    ,使其可执行。一个
    chmod+r term\u boot.exp
    也很有用,但是您必须在bashrc文件中添加sudo之前的/ssh.exp。因此,每次启动终端时,您都必须输入sudo密码。对我来说,这比密码更方便,因为我记得我的管理员(sudo)密码在壁炉旁

    此外,我认为还有另一种方法;


    当我有时间时,我肯定会更改我的方法。

    您也可以将答案通过管道发送到脚本:

    printf“y\n密码\n”| sh test.sh
    

    其中
    \n
    是转义序列

    我将其取回,ssh通过tty设备进行提示,该设备绕过stdin。用Emily Litella的话说,“没关系”。)唉!在浪费了几个小时之后。。。找到了最好的解决方案,谢谢。标题中没有指定SSH,因此虽然这不适用于OP,但其他找到问题的人可能需要并使用此答案。顺便说一句,herestring语法--
    我们真的应该停止将expect作为自动化ssh的一种方式来推广。Ssh故意使这些提示难以自动化,以促使我们使用正确的解决方案:命令行标志绕过确认,公钥/私钥消除密码提示。这很理想,但现实世界往往并不理想。对于提出的问题,这是典型的解决方法。如果您使用了密钥,您可能也希望密钥上有一个密码,那么您可能也会遇到同样的情况。当然,您可以使用
    ssh代理
    keychain
    ,等等。但有时会有一些不方便或不切实际的原因。我们真的应该停止将expect作为自动化ssh的一种方式来推广。Ssh故意使这些提示难以自动化,以促使我们使用正确的解决方案:命令行标志绕过确认,公钥/私钥消除密码提示。如果是第三方脚本,并且命令行标志不可用,该怎么办?@HarshVerma答案没有警告或警告,因此我支持我的评论。
    #!/bin/bash
    
    ssh-add /the/path/of/yourkey_id_rsa
    
    exit 0