我见过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
答案 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>)
。