如何使用 expect 和 bash 脚本在远程服务器中运行本地脚本

如何使用 expect 和 bash 脚本在远程服务器中运行本地脚本

我想编写一个脚本,该脚本将连接到服务器并在服务器上执行一些 CRUD 操作,然后再次返回本地。我不想将脚本上传到服务器。

我已经编写了一个有助于连接服务器的脚本,但我无法借助该脚本的帮助执行任何操作。

请澄清我的疑问,是否可以在远程服务器中运行本地脚本(如我的情况)。

如果是,请指定脚本,我将非常感激。

到目前为止我的脚本是

#!/usr/bin/expect
set ip neviss
set user user
set password 1234
spawn ssh "$user\@$ip"
expect "Password:"
send "$password\r";
interact ( after this line any command is not getting executed) 
ls -lrt 

答案1

尝试这样的操作:

#!/usr/bin/expect
spawn ssh usert@server
expect "user@server's password:" {send "$password\r"}
expect "$ " {send "hostname\n"}
expect "$ " {send "ls -alrth\n"}
expect "$ " {send "exit\n"}

不确定这是否是最有效的方法,但它似乎在我的测试中有效。($ 后面有空格)

另外,您可以将其放在脚本“exp_internal 1”的顶部。

这将有助于调试过程!

答案2

您无需调用 Interact 即可发送命令。Interact 会等待您的输入。

以下是在远程服务器中运行“test.sh”脚本的一个工作示例(还调用了其他几个命令来说明这个想法),这也解决了用户/根提示符不同的问题。请记住使 test.sh 可执行。

#!/usr/bin/expect

set prompt "(%|#|\\$) $"
set ip neviss
set user user
set password 1234

spawn ssh "$user\@$ip"
expect "assword:"
send "$password\r";
expect -re $prompt
send -- "ls -l\r"
expect -re $prompt
send -- "./test.sh\r"
expect -re $prompt
send -- "sleep 5\r"
expect -re $prompt
send -- "exit\r"

答案3

您可以让它ssh完成大部分工作。假设您的本地脚本是一个 bash 脚本,并且它位于名为“local.script”的文件中:

#!/usr/bin/expect
set ip neviss
set user user
set password 1234
set script local.script

# here I spawn a shell that will run ssh and redirect the script to ssh's stdin

spawn sh -c "ssh $user@$ip bash < $script"

expect "Password:"
send "$password\r"

# and just wait for the script to finish
expect eof

请注意,@在 Tcl 中不是特殊字符,并且不需要转义。

相关内容