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

l0oc07j2  于 2023-10-23  发布在  Shell
关注(0)|答案(7)|浏览(173)

在我的shell脚本中,我正在运行一个命令,它要求我输入。
我怎样才能给予命令它所需要的自动输入?
举例来说:

$cat test.sh
ssh-copy-id [email protected]

运行test.sh时:

  • 首先,它会问:

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

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

[[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection) 's password:
有办法自动输入吗?

smtd7mpg

smtd7mpg1#

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

test.sh <<!
y
pasword
!

<<前缀是一个模式,在本例中是'!直到以该模式开始的一行的所有内容都被解释为标准输入。这种方法类似于将多行echo通过管道传输到ssh中的建议,除了它保存了echo命令的fork/exec,我发现它更具可读性。另一个优点是它使用内置的shell功能,因此它不依赖于expect。

flseospp

flseospp2#

对于一般的命令行自动化,Expect是经典的工具。如果您对Python更熟悉,请尝试pexpect
这里有一个类似的问题,建议使用Expect:Use expect in bash script to provide password to SSH command

n7taea2i

n7taea2i3#

一定有...使用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
您可能需要首先安装这些命令,具体取决于您的系统。

deyfvvtc

deyfvvtc4#

你也可以将答案导入脚本:

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

其中\n是转义序列

9nvpjoqh

9nvpjoqh5#

ssh-key with passphrase,with keychain

keychain是一个小型实用程序,它代表您管理ssh-agent,并允许ssh-agent在登录会话结束时保持运行。在后续登录时,keychain将连接到现有的ssh-agent示例。实际上,这意味着只有在重新引导后的第一次登录时才必须输入密码。在后续登录时,将使用来自现有ssh-agent示例的未加密密钥。这对于在没有无密码ssh-key的cron作业中允许无密码RSA/DSA身份验证也很有用。
要启用keychain,请安装它并将以下内容添加到~/.bash_profile:
eval keychain --agents ssh --eval id_rsa从安全性的Angular 来看,ssh-ident和keychain比ssh-agent示例更糟糕,仅限于特定会话的生存期,但它们提供了很高的便利性。为了提高keychain的安全性,有些人在~/.bash_profile keychain调用中添加了--clear选项。通过这样做,密码必须在登录时重新输入,但是在用户注销后,cron作业仍然可以访问未加密的密钥。keychain wiki页面有更多信息和示例。
得到这个信息从;
https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt
希望这有帮助
我个人已经能够在终端启动时自动输入我的密码,方法是:(当然,您可以修改脚本并使其适合您的需要)
1.编辑bashrc文件以添加此脚本;

检查SSH agent是否唤醒

if [ -z“$SSH_AUTH_SOCK”] ;然后执行ssh-agent bash -c“ssh-add ;$0”echo“SSH代理被唤醒”exit 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

以下是我的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/
当我有时间的时候,我一定会改变我的方法。

vvppvyoh

vvppvyoh6#

您可以按如下方式编写expect脚本:

$ vi login.exp

#!/usr/bin/expect -f
spawn ssh [email protected]
expect "*assword: "
send -- "PASSWORD\r"
interact

并运行它:

$ expect login.exp
vof42yt1

vof42yt17#

如果是sudo密码-最简单的:
<your-command>转换为:

echo <password> | sudo -S ls | <your-command>

相关问题