将ls命令的结果保存在本地计算机上的远程sftp服务器中

时间:2014-01-10 19:36:18

标签: linux bash sftp expect ls

我见过This question,但我对答案不满意。我连接到远程sftp服务器,我会在那里做我想在我的本地机器上得到ls的结果。我不希望保存任何额外的东西,只有ls命令的结果。我可以将结果保存到本地计算机上可访问的变量吗?

#!/usr/bin/expect

spawn sftp myuser@myftp.mydomain.com
expect "password:"
send "mypassword\n";
expect "sftp>"
send  "ls\n"  //save here
interact

3 个答案:

答案 0 :(得分:3)

尝试将ls输出发送到日志文件:

spawn sftp myuser@myftp.mydomain.com
expect "password:"
send "mypassword\n";
expect "sftp>"
log_file -noappend ls.out
send  "ls\n"  //save here
expect "sftp>"
log_file
interact

log_file -noappend ls.out触发日志记录程序输出,后来log_file不带参数将其关闭。需要预期另一个sftp提示,否则它不会记录输出。

日志中会有两行额外的行 - 第一行是ls命令本身,最后一行是sftp>提示符。您可以使用sed -n '$d;2,$p' log.out之类的内容过滤掉它们。然后你可以将文件的内容粘贴到shell变量,删除临时文件等等。

答案 1 :(得分:2)

以下是我将如何做到这一点,采用更“传统”的方法,包括打开一个文件来编写所需的输出(我喜欢@kastelian的log_file想法):

#!/usr/bin/expect

spawn sftp myuser@myftp.mydomain.com
expect "password:"
send "mypassword\n";
expect "sftp>"

set file [open /tmp/ls-output w]     ;# open for writing and set file identifier

expect ".*"     ;# match anything in buffer so as to clear it

send  "ls\r"

expect {
    "sftp>" {
        puts $file $expect_out(buffer)  ;# save to file buffer contents since last match (clear) until this match (sftp> prompt)
    }
    timeout {     ;# somewhat elegant way to die if something goes wrong
        puts $file "Error: expect block timed out"
    }
}

close $file

interact

生成的文件将保留与log_file建议解决方案相同的两行:顶部的ls命令和sftp>在底部提示,但你应该能够随心所欲地处理这些。

我测试了这个并且它有效。

让我知道它是否有帮助!

答案 2 :(得分:0)

您可以使用echo 'ls -1' | sftp <hostname> > files.txt。或者,如果你真的想要一个shell变量(如果你有一个长文件列表,不推荐),试试varname=$(echo 'ls -1' | sftp <hostname>)