Anda mendapatkan status keluar dari proses pemijahan dengan wait
perintah:
expect <<'END'
log_user 0
spawn sh -c {echo hello; exit 42}
expect eof
puts $expect_out(buffer)
lassign [wait] pid spawnid os_error_flag value
if {$os_error_flag == 0} {
puts "exit status: $value"
} else {
puts "errno: $value"
}
END
hello
exit status: 42
Dari halaman manual expect
tunggu [args]
penundaan hingga proses yang muncul (atau proses saat ini jika tidak ada yang disebutkan namanya) berakhir.
tunggu biasanya mengembalikan daftar empat bilangan bulat. Bilangan bulat pertama adalah pid dari proses yang ditunggu. Bilangan bulat kedua adalah spawn id yang sesuai. Bilangan bulat ketiga adalah -1 jika terjadi kesalahan sistem operasi, atau 0 sebaliknya. Jika bilangan bulat ketiga adalah 0, bilangan bulat keempat adalah status yang dikembalikan oleh proses pemijahan. Jika bilangan bulat ketiga adalah -1, bilangan bulat keempat adalah nilai errno yang ditetapkan oleh sistem operasi. ErrorCode variabel global juga disetel.
Ubah
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
}
untuk
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
eof
}
Kemudian tambahkan lassign
dan if
perintah.
Dengan bantuan glenn, saya mendapat solusi.. dan skrip terakhir saya adalah::
skrip yang diharapkan adalah
[Linux Dev:anr ]$ cat testexit.sh
#!/bin/bash
export tmp_script_file="/home/anr/tmp_script_temp.sh"
cp /home/anr/tmp_script $tmp_script_file
chmod a+x $tmp_script_file
cat $tmp_script_file
expect << 'EOF'
set timeout -1
spawn $env(tmp_script_file)
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
eof
}
foreach {pid spawnid os_error_flag value} [wait] break
if {$os_error_flag == 0} {
puts "exit status: $value"
exit $value
} else {
puts "errno: $value"
exit $value
}
EOF
echo "spawned process status" $?
rm -f $tmp_script_file
echo "done"
Skrip yang dihasilkan:
[Linux Dev:anr ]$ cat tmp_script
exit 3
Eksekusi skrip Harapan:
[Linux Dev:anr ]$ ./testexit.sh
exit 3
spawn /home/anr/tmp_script_temp.sh
exit status: 3
spawned process status 3
done
Terima kasih Glenn sekali lagi..
Setelah berjuang beberapa hari dengan memperluas variabel di dalam ekspektasi heredoc, akhirnya saya menemukan pendekatan lain yang menurut saya dapat membantu seseorang yang membutuhkan. Persyaratan saya adalah meneruskan perintah dan kata sandi ke fungsi shell, menjalankan perintah di host jarak jauh sebagai bagian dari expect heredoc dan mendapatkan kode keluar kembali.
Contoh:
function shell_function {
# Get the command and password as arguments
# Run command using expect
# Return the exit code
}
shell_function <cmd> <password>
echo $?
Seperti orang lain memperluas variabel di dalam heredoc adalah masalah, yang mengharuskan mengekspor nilai ke variabel lingkungan dan menggunakan env
untuk mendapatkan variabel di dalam heredoc. Karena kata sandi adalah salah satu argumen saya tidak ingin menyimpannya sebagai bagian dari variabel lingkungan. Jadi, alih-alih melampirkan pembukaan heredoc dengan tanda kutip tunggal, variabel heredoc telah diloloskan. Ini memungkinkan penggunaan langsung dari argumen yang diteruskan.
Berikut ini adalah skrip terakhir:
#! /bin/bash
# This function runs a command like 'ssh' and provides the password
function run_with_password {
cmd="$2"
paswd="$1"
expect << END
set timeout 60
spawn $cmd
expect {
"yes/no" { send "yes\r" }
"*assword*" { send -- $paswd\r }
}
expect EOF
catch wait result
exit [lindex \$result 3]
END
}
my_password="AnswerIS42Really?"
cmd_to_run="ssh [email protected]"
cmd_to_run="$cmd_to_run ls .sawfish"
run_with_password $my_password "$cmd_to_run"
echo "Command run code: $?"
Dalam kode di atas, variabel ekspektasi yang lolos adalah $result
. Setelah mengubah variabel menjadi \$result
, skrip mulai bekerja dengan sangat baik.
Terima kasih tulus saya kepada pengguna yang telah memberikan jawaban atas pertanyaan berikut, yang berfungsi sebagai batu loncatan untuk mencapai solusi saya.
Douglas Leeder:bantu dengan skrip ekspektasi, jalankan cat di komputer jarak jauh dan dapatkan keluarannya ke variabel
glenn jackman:Bagaimana cara mengembalikan kode keluar proses yang muncul di skrip Expect?