我正在尝试使用bash脚本实现以下功能:
我知道invidiual命令,它们将是: 1)检查ssh连接:
ssh -q user@ip exit
echo $?
成功时应返回“0”,错误时返回“255”。
2)执行top并保存到文件将是:
top -n 1 -b > /tmp/top.out
3)scp远程主机的文件
expect -c "
set timeout 1
spawn scp user@host:/tmp/top.out root@anotherhost:/.
expect yes/no { send yes\r ; exp_continue }
expect password: { send password\r }
expect 100%
sleep 1
exit
"
现在完全放这个是我的问题,更具体一点:
当使用expect测试SCP连接时,我似乎无法获得返回的'0'和'255'值。
期待-c“ 设置超时1 spawn ssh user @ host top -n 3 -b> /tmp/top.out 期待密码:{发送密码\ r \ n} 睡觉1 出口 “
感谢任何帮助。请记住,我的脚本是带有#!/ bin / bash 声明的.sh脚本 - 我不能使用#!/ usr / bin / expect 进行各种操作的原因。
答案 0 :(得分:4)
现在那是丑陋的东西。有很多陷阱,可能你不太确定你用shell执行什么地方,或者使用普通的argv数组。此外,期望的东西不是 应该完成的方式,这只是脆弱的。
(AFAIK,expect
主要用于与调制解调器(AT命令集)等进行通信。
使用SSH密钥自动使用ssh和scp而不是密码。一旦你完成了(甚至之前,但你必须手动输入密码),在你的shell中启动它:
$ ssh user@server "top -n 1 -b" > /tmp/top.out
该文件将在您的本地计算机上。 (因为重定向是在本地完成的,尚未远程完成)。不需要scp。
这就是它的全部内容。
答案 1 :(得分:0)
检查一下: https://stackoverflow.com/a/23632210/524743
expect <<'END'
log_user 0
spawn sh -c {echo hello; exit 42}
expect eof
puts $expect_out(buffer)
lassign [wait] pid spawnid os_error_flag value
if {$os_error_flag == 0} {
puts "exit status: $value"
} else {
puts "errno: $value"
}
END
hello
exit status: 42
来自期待手册页
等[args]
延迟到产生的进程(或当前进程,如果没有命名)终止。
等待正常返回四个整数的列表。第一个整数是等待进程的pid。第二 integer是相应的spawn id。如果是,则第三个整数为-1 发生操作系统错误,否则为0。如果是第三个整数 为0,第四个整数是生成的返回状态 处理。如果第三个整数是-1,则第四个整数是该值 由操作系统设置的错误号。全局变量errorCode是 也设定了。