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

cam*_*ino 29 ssh shell

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

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

例如:

$cat test.sh
ssh-copy-id tester@10.1.2.3
Run Code Online (Sandbox Code Playgroud)

运行test.sh时:

  • 首先,它会问:

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

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

    tester@10.1.2.3's password:

有没有办法自动输入?

Mar*_*hen 35

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

test.sh <<!
y
pasword
!
Run Code Online (Sandbox Code Playgroud)

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

  • 标题没有指定SSH,因此虽然这不适用于OP,但其他人发现该问题可能需要并使用此答案。顺便说一句,herestring语法-'&lt;&lt;&lt; $'y \ npasword'`-也可能对其他人有用。 (3认同)

jjl*_*lin 17

对于一般的命令行自动化,Expect是经典的工具.或者如果你对Python更熟悉的话,试试pexpect.

这是一个类似的问题,建议使用Expect:在bash脚本中使用expect 为SSH命令提供密码

  • 这是理想的,但现实世界往往并不理想。对于提出的问题,这是典型的做法。如果您使用了密钥,您可能也需要在您的密钥上设置密码,然后您很可能处于相同的情况。当然,你可以使用 `ssh-agent`、`keychain` 等,但有时有一些不方便或不切实际的原因。 (3认同)

Mic*_*hri 7

肯定有...使用spawn,expect和send命令:

spawn test.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
Run Code Online (Sandbox Code Playgroud)

Stack Overflow上有更多示例,请参阅: 在bash脚本中帮助Expect

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