SSH 命令在 expect 脚本中表现不同

SSH command behaving differently in expect script

我正在创建一个脚本,该脚本从主机 A 执行以连接到远程主机 b,运行s 主机上的 bash 脚本(从 top 等生成监控数据) -b,并将输出追加回主机 A 上的文件。虽然我使用 ssh 进行连接,但我不会使用 ssh-keys,因为环境中的服务器太多了。

我期望的脚本:

"#!/usr/bin/expect

"#!/usr/bash

set timeout 10

set hostname [sample_hostname]

set user "(sample_user)"

set password "(sample_password)"


spawn ssh $user@$hostname /path/to/bash/script/script.sh | cat >> /tmp/file

expect "Password:"

send "$password\r";

expect "$"

====================================

以上脚本将 bash 脚本的输出附加到主机 B /tmp/file 而不是所需的主机 A /tmp/file。我怎样才能将脚本附加到主机 A 而不是主机 b?

P.S.

  1. 手动登录主机 A
  2. cd 到脚本位置
  3. 运行 ssh 用户@主机名 /path/to/script/script.sh | cat >> /tmp/file 在主机 A
  4. 猫/tmp/file

以上手动步骤按要求执行;因此我认为问题出在 expect.bash 中。

欢迎任何想法!

此致,

艾伦

我假设您使用 expect/set 方法是因为密码。

安装后我发现了另一个名为 sshpass 的应用程序,您只需 运行 在您的 bash 中使用这样的命令即可。

sshpass -p PASSWORDHERE ssh user@hostname /path/to/bash/script/script.sh | cat >> /tmp/file

http://linux.die.net/man/1/sshpass

享受

如果您只想获取该脚本的输出,请按照以下方式继续。

#!/usr/bin/expect 

set timeout 10

set hostname host
set user dinesh
set password pwd
set script "/home/dinesh/mypgms/demo.sh"
spawn ssh $user@$hostname
expect "password:"
send "$password\r";
expect "\$"; # Matching the literal dollar prompt sign of terminal
send "$script\r"
expect -re "\r\n(.*)\$"; # Matching the output
# Getting first sub-match as result
puts "\nResult : --->$expect_out(1,string)"

这将给出输出

dinesh@dinesh-VirtualBox:~/Whosebug$ ./alan 
spawn ssh dinesh@host
dinesh@host's password: 
Last login: Tue Apr 21 13:30:35 2015 
[dinesh@ ~]$ /home/dsivaji/mypgms/demo.sh
{\"INFO\":0}[=11=]\r
{\"INFO\":0}[=11=]\r
[dinesh@~]$ 
Result : --->{\"INFO\":0}[=11=]\r
{\"INFO\":0}[=11=]\r
[dinesh@~]
dinesh@dinesh-VirtualBox:~/Whosebug$ 

请注意,结果为

{\"INFO\":0}[=12=]\r
{\"INFO\":0}[=12=]\r
[dinesh@~]

因为我们匹配到提示 $,它包含到那个点。您还可以根据 shell 输出自定义正则表达式。