/ / Očakávať skript: získajte posledný upravený dátum v premennej - tcl, sftp, expect

Očakávať skript: naposledy zmenený dátum v premennej - tcl, sftp, očakávať

Pripájam sa k vzdialenému systému pomocou sftp pomocou očakávania. Chcem získať posledný upravený dátum súboru my.csv do premennej očakávaného skriptu

Nižšie je môj kód:

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

odpovede:

2 pre odpoveď č. 1

Dobre, ja som sa na to hlbšie pozrel. Vidím pár vecí zle:

  1. Keď spustíte ls -la, robíte tak na svojomlokálny počítač ... nie na vzdialenom serveri sftp. Ak ju chcete spustiť na serveri sftp, musíte použiť príkaz „odoslať“, aby sa odoslal cez vytvorenú reláciu.
  2. Ak by ste chceli použiť príkaz „send“, môžete ho previesť cez awk, pretože to bude príkaz servera sftp a na rozhraní servera sftp nebude žiadny awk.
  3. Nakoniec si nemyslím, že odosielanie výstupu ozveny do spomenutej relácie sftp je to, čo chcete. Myslím, že chcete, aby sa zobrazovala na miestnom počítači. Príkaz TCL „dá“ je tým, čo tam chcete.

Čo musíte urobiť, je poslať príkaz ls na server sftp, potom pomocou očakávania s regulárnym výrazom vyňať časovú pečiatku z vráteného výstupu.

Pravdepodobne existujú elegantnejšie spôsoby, ako to vylepšiťmačka, ale predpokladáme anglický jazyk pre celé mesiace a že váš názov súboru je vždy totožný (my.csv), tu je pracovná varianta (na TCL 8.4.13) tohto skriptu:

spawn sftp user@host
expect "assword:"
send "mypasswordr";
expect "sftp>"
send "ls -la my.csvr"
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 "quitr";
expect eof
puts "Timestamp is: $timestamp"

Ponechám vám kontrolu nad chybami, vybavím časové limity a všetko dobré.

Dajte mi vedieť, či to fungovalo vo vašom prostredí.