期望脚本:在变量中获取最后修改日期

时间:2014-01-27 21:33:03

标签: tcl sftp expect

我使用expect通过sftp连接到远程系统。 我想将my.csv文件的最后修改日期变为expect脚本

中的变量

以下是我的代码:

 spawn sftp -o Port=$port $user@$host
 expect "Password:"
 send "$password\r";
 expect "sftp> "
 set file_time [exec ls -la my.csv| awk {{ print $6$7$8}}]
 send "echo $file_time\r";
 expect "sftp> "
 send "quit\r";
 expect eof

1 个答案:

答案 0 :(得分:2)

好的,我更加努力地看待这个。我看到一些错误:

  1. 当您执行ls -la时,您在本地计算机上执行此操作...而不是在远程sftp服务器上执行此操作。如果要在sftp服务器上执行该操作,则需要使用“send”,以便通过生成的会话发送它。
  2. 如果您使用'send',那么您无法通过awk传输它,因为它将是一个sftp服务器命令,并且sftp服务器接口上没有awk。
  3. 最后,我不认为发送echo输出到生成的sftp会话是你想要的。我猜你想把它显示在本地机器上。所以TCL命令'puts'就是你想要的。
  4. 所以你需要做的是将ls命令发送到sftp服务器,然后使用expect和正则表达式从返回的输出中抓取时间戳。

    可能有更优雅的方法来修饰这只猫,但假设几个月的英语,并且你的文件名总是相同的(my.csv),这是该脚本的一个工作变体(在TCL 8.4.13上): / p>

    spawn sftp user@host
    expect "assword:"
    send "mypassword\r";
    expect "sftp>"
    send "ls -la my.csv\r"
    expect -re "\[-rwx\]{10}.*((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec).*)my.csv"
    set timestamp $expect_out(1,string)
    expect "sftp>"
    send "quit\r";
    expect eof
    puts "Timestamp is: $timestamp"
    

    我会留下错误控制,处理超时和所有好东西给你。 : - )

    如果在您的环境中有效,请告诉我。