Аз пиша баш скрипт и използвам очаквам да направяSFTP. Сега в очакването блок искам да има достъп до баш променлива в условно изявление. но не мога да го направя. Може ли някой да помогне в това. Също така, изпълнението на този скрипт се контролира от програма c и аз няма да пренасочи изхода към дневника файл (който отново е динамичен) .Мога ли да направя това и да потискат всички изход на stdout
тук е кодът
!/usr/bin/bash
host=$1
user=$2
pass=$3
action=$4
path=$5
echo "Starting...."
function doAction {
strAction="""$action"""
echo $strAction
/usr/bin/expect <<EOF > logfile.txt
**set bashaction $strAction**
spawn sftp $user@$host
expect "password:"
send "$passr"
expect"sftp>"
send "cd $pathr"
**if {$bashaction == "TEST"} {**
expect "sftp>"
send "promptr"
}
expect "sftp>"
send <sftp command>
expect "sftp>"
send_user "quitn"
exit
EOF
}
doAction
echo "DONE....."
за 1. използване на опитен скрипт вместо да работи.
за проблема за влизане в системата, използвайки log_user 0 и log_file -a помогна
Отговори:
9 за отговор № 1Не е нужно да използвате bash
, expect
може да се справи с всичко това:
#!/usr/bin/expect
set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set action [lindex $argv 3]
set path [lindex $argv 4]
puts "Starting...."
puts ""$action""
spawn sftp $user@$host
expect "password:"
send "$passr"
expect"sftp>"
send "cd $pathr"
if {$action == "TEST"} {
# Do something
} else {
# Do something else
}
expect "sftp>"
send_user "quitr"
puts "DONE....."
Идващи от bash
, Tcl / Expect синтаксиса е малко странно, но не би трябвало да имате проблем, разширявайки горния скелет. Късмет.
2 за отговор № 2
Достъп до променливи на средата от TCL и очаквайте
Тъй като се обаждате на този скрипт Expect от друг процес, можете да използвате променливи на средата. Например, ако родителският ви процес е експортиран действие за околната среда, тогава можете да получите достъп до стойността му в рамките на очаквания скрипт с:
$::env(action)
В Баш можеш маркирайте променливата за експорт с износ Вградената. Например:
export action
Тъй като не съм сигурен как извиквате скрипта Expect от C, зависи от вас, за да сте сигурни, че променливата е правилно експортирана.
Деактивиране на регистрирането в стандартен изход
За да деактивирате регистрацията на стандартния изход от заредените процеси, Expect предоставя командата log_user. Можете да предотвратите възникването на процесите на заразяване от писане до stdout log_user 0
.
Очаквайте (1) ръководството казва:
По подразбиране диалоговият прозорец изпращане / очакване е вписан вstdout (и a ако е отворен). Записването в стpout е деактивирано от командата "log_user 0" и отново активиран от "log_user 1". Влизане в регистрационния файл не се променя.
Това всъщност не е така близо стандартен изход, който по принцип не е това, което искате все пак. Това ще доведе до всичко, което пише на stdout да хвърли грешка като това:
can not find channel named "stdout"
while executing
"puts hello"
(file "/tmp/foo" line 8)
0 за отговор № 3
За да изключите изхода на ството, което можете да използвате
command here >/dev/null 2>/dev/null
За да пишете в дневника, можете да използвате подобни тръби (>
или >>
), или tee
команда, ако искате да напишете изхода в средата на дългата тръба.