GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendapatkan kode keluar dari proses pemijahan di skrip Shell yang diharapkan?

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?


Linux
  1. Bagaimana Cara Mendapatkan Alamat Ip Sendiri Dan Menyimpannya Ke Variabel Dalam Script Shell?

  2. Bagaimana Mendapatkan Informasi Lebih Lanjut Tentang Asal Usul Kode Keluar?

  3. Bagaimana cara mendapatkan PYTHONPATH di shell?

  1. Bagaimana cara mendapatkan ID proses untuk mematikan proses nohup?

  2. Cara mendapatkan PID dari proses anak bercabang di skrip Shell

  3. Bagaimana cara mendapatkan pid dari suatu proses dan mengaktifkan kill -9 di skrip Shell?

  1. Bagaimana Cara Mendapatkan Alamat Ip Eksternal Dalam Script Shell?

  2. Bagaimana Cara Mengenkripsi Atau Membuat Skrip Shell Tidak Dapat Dibaca?

  3. Bisakah proses init menjadi skrip shell di Linux?