有没有办法在运行shell时自动输入?

时间:2012-01-31 06:42:27

标签: shell

在我的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:

有没有办法自动输入?

5 个答案:

答案 0 :(得分:32)

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

test.sh <<!
y
pasword
!

&lt;&lt;前缀一个模式,在本例中为'!'。从该模式开始的所有行都被解释为标准输入。这种方法类似于将多行回显传递给ssh的建议,除了它保存了echo命令的fork / exec,我发现它更具可读性。另一个优点是它使用内置的shell功能,因此它不依赖于期望。

答案 1 :(得分:15)

对于常规命令行自动化,Expect是经典工具。如果您对Python更熟悉,请尝试pexpect

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

答案 2 :(得分:7)

肯定有...使用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

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

答案 3 :(得分:1)

带密码的ssh-key,带钥匙串

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

要启用钥匙串,请安装它并在〜/ .bash_profile中添加以下内容:

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

获取此信息

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

希望这有帮助

我个人能够在终端发布时自动输入我的密码短语:(当然,您可以修改脚本并使其符合您的需求)

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

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

    if [-z&#34; $ SSH_AUTH_SOCK&#34; ];然后 exec ssh-agent bash -c&#34; ssh-add; $ 0#34; echo&#34; SSH代理被唤醒&#34; 出口 网络

    以上行将在终端启动时启动expect脚本。

    ./ ssh.exp

  2. 这是预期脚本的内容

    keychain --agents ssh --eval id_rsa

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

    #!/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
    

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

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

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

答案 4 :(得分:0)

您还可以将答案发送到脚本:

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

其中\n是转义序列