我需要编写一个TCL程序,通过它我可以登录到远程服务器,然后在远程服务器上执行命令;我还需要从远程服务器获取输出。
修改
感谢Kostix的回复。我的要求是TCL脚本应该能够登录到远程服务器。我打算通过expect
机制发送密码,之后我计划发送命令。我的示例代码如下:
set prompt "(%|>|\#|\\\$) #"
spawn /usr/bin/ssh $username@$server
expect {
-re "Are you sure you want to continue connecting (yes/no)?" {
exp_send "yes\r"
exp_continue
#continue to match statements within this expect {}
}
-nocase "password: " {
exp_send "$password\r"
interact
}
}
我可以使用此登录但不知道如何扩展此代码以发送命令。我尝试了很少的方法,但没有成功。
答案 0 :(得分:0)
由于您即将使用SSH,您可能根本不需要Tcl和Expect来执行此任务:因为SSH代表“Secure SHell”,所以您需要做的远程执行命令就是告诉SSH登录后在远程端产生什么程序(如果你不这样做,SSH产生登录用户的所谓“登录shell”),然后SSH提供程序,你通过SSH客户端的程序输入和通道返回远程程序写入其标准输出流的内容。
要通过SSH自动化日志记录,有几种方法:
sshpass
程序将呼叫包装到SSH客户端来欺骗它。因此,接下来要执行的步骤将是缩小您的要求:
在回答这些问题之前,初始问题没什么意义,因为它太宽泛,因此不符合stackoverflow格式。
答案 1 :(得分:0)
服务器上的命令可以使用像这样的exec命令执行,
set a [exec ls -lrta]
puts $a
[OR]期望和执行循环可以如上继续; 我正在使用哪个linux命令可以轻松运行;
package require Expect
proc ExecCommand {username server password cmd } {
spawn /usr/bin/ssh $username@$server
expect {
".*(yes/no)? " {exp_send "yes\r" ; exp_continue}
".*password: " {exp_send "$password\r";exp_continue}
".*$ " {exp_send -i $spawn_id "$cmd \r";
expect {
".*$ " { return 1; close }
}
}
}
}
set result [ExecCommand "admin" "0" "qwerty" "ls"]
if {$result > 0 } {
puts "Command succesfully executed\n"
} else {
puts "Failed to execute\n"
}