我想编写一个脚本,该脚本将连接到服务器并在服务器上执行一些 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 中不是特殊字符,并且不需要转义。