1

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

}

我可以用这个登录,但不知道如何扩展这个代码来发送命令。我尝试了几种方法,但没有奏效。

4

2 回答 2

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 外壳?还有什么?
  3. 该远程命令是否应该使用某种程度的交互性编写脚本(我们向它发送一些内容,然后等待回复并根据它决定接下来要发送什么)还是批处理样式的脚本可以?

在回答这些问题之前,最初的问题没有什么意义,因为它太宽泛,因此不符合 stackoverflow 格式。

于 2013-01-24T12:22:26.367 回答
0

服务器上的命令可以使用这样的 exec 命令执行,

set a [exec ls -lrta]
puts $a

[OR] 可以像上面那样继续期望和执行循环;我正在制作一个可以轻松运行 linux 命令的 proc;

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"
}
于 2017-08-02T09:42:16.973 回答