使用带有期望的ssh编写远程列表

时间:2019-01-21 16:34:19

标签: ssh scripting expect

我需要在shell脚本中使用ssh阅读远程目录的列表。 我正在使用Expect,而我尝试的代码是

#!/bin/expect

spawn ssh user@server 'ls -t path | head -1' > dir.txt
expect 'Password:*'
send "Password\n"

结果是未创建任何文件。 但是,如果我在shell上运行相同的命令,它将起作用

ssh user@server 'ls -t path | head -1' > dir.txt

1 个答案:

答案 0 :(得分:1)

  1. 期望(以及它后面的Tcl)不对任何东西使用单引号,它们只是普通字符。您正在有效地这样做:

    spawn ssh user@server "'ls" "-t" "path" "|" "head" "-1'" ">" "dir.txt"
    
  2. 我不确定,但是可以确定spawn不会为您进行任何重定向

尝试一下:让shell进行重定向:在这里,我使用{braces},这是Tcl进行非插值引用的方式。

spawn sh -c {ssh user@server 'ls -t path | head -1' > dir.txt}
expect 'Password:*'
send "Password\n"
expect eof

expect eof将等待进程结束,然后才能继续执行脚本。


作为进一步参考,这是Tcl语法手册:https://tcl.tk/man/tcl8.6/TclCmd/Tcl.htm-这是一种非常简单的语言,只有12条规则。