代码之家  ›  专栏  ›  技术社区  ›  sthor69

使用ssh和expect编写远程列表

  •  1
  • sthor69  · 技术社区  · 6 年前

    我需要在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 回复  |  直到 6 年前
        1
  •  1
  •   glenn jackman    6 年前
    1. Expect(以及背后的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条规则。