如何在SSH上运行shell时自动输入?
在我的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
$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_配置文件中:
evalkeychain--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