在我的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:
有没有办法自动输入?
答案 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作业仍然可以访问未加密的密钥。钥匙串维基页面提供了更多信息和示例。
从
获取此信息希望这有帮助
我个人能够在终端发布时自动输入我的密码短语:(当然,您可以修改脚本并使其符合您的需求)
编辑bashrc文件以添加此脚本;
if [-z&#34; $ SSH_AUTH_SOCK&#34; ];然后 exec ssh-agent bash -c&#34; ssh-add; $ 0#34; echo&#34; SSH代理被唤醒&#34; 出口 网络
./ ssh.exp
这是预期脚本的内容
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
是转义序列