TCL程序登录远程服务器并执行命令

时间:2013-01-24 11:26:47

标签: tcl expect tclsh

我需要编写一个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
   }

}

我可以使用此登录但不知道如何扩展此代码以发送命令。我尝试了很少的方法,但没有成功。

2 个答案:

答案 0 :(得分:0)

由于您即将使用SSH,您可能根本不需要Tcl和Expect来执行此任务:因为SSH代表“Secure SHell”,所以您需要做的远程执行命令就是告诉SSH登录后在远程端产生什么程序(如果你不这样做,SSH产生登录用户的所谓“登录shell”),然后SSH提供程序,你通过SSH客户端的程序输入和通道返回远程程序写入其标准输出流的内容。

要通过SSH自动化日志记录,有几种方法:

  • 使用公钥进行身份验证:如果私有(客户端)密钥不受密码保护,则此方法根本不需要脚本 - 您只需告诉SSH客户端使用哪个密钥。
  • “键盘交互式”身份验证(基于密码)。这是大多数人认为SSH的全部意义(这是错误的)。由于SSH坚持从“真正的终端”获取密码,因此编写脚本有点困难。可以通过使用Expect或简单地使用sshpass程序将呼叫包装到SSH客户端来欺骗它。
  • SSH客户端和服务器都可能支持基于Kerberos或基于GSSAPI的身份验证。使用它可能不需要任何脚本,因为它从系统(本地用户的会话)派生身份验证凭据。

因此,接下来要执行的步骤将是缩小您的要求:

  1. 必须支持哪种身份验证?
  2. 哪个程序应该执行您打算从客户端发送的命令?那将是一个Unix shell吗?一个Tcl shell?还有别的吗?
  3. 该远程命令是否应使用某种程度的交互性编写脚本(我们向其发送内容然后等待回复并根据它确定接下来要发送的内容)或者批处理式脚本可以吗?
  4. 在回答这些问题之前,初始问题没什么意义,因为它太宽泛,因此不符合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"
}