ssh dan shell melalui ssh: bagaimana cara keluar?


22

Saya meluncurkan skrip yang jauh melalui SSH seperti ini:

ssh user@ipaddress '~/my_script.sh'

Semuanya baik-baik saja tetapi setelah skrip selesai, koneksi tidak ditutup. Saya Harus menekan CTRL-C untuk memutuskan koneksi saat ini.

Saya sudah mencoba perintah "keluar" di '~ / my_script.sh' dan tidak berguna. Saya sudah mencoba perintah "logout" di '~ / my_script.sh' dan saya mendapat pesan:

logout: not login shell: use exit

...

Adakah yang bisa saya lakukan untuk menutup SSH secara otomatis dan benar setelah skrip selesai?

(Modifikasi untuk klarifikasi :) Inilah yang ada di dalam skrip saya:

#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas

umount_disque_qas()
{
  # Umount du disque 'qas' s'il n'avait pas été 'umount' :
  nom_disque_monte=`cat /etc/mtab | grep qas | awk '{ print $2}'`
  if [ "$nom_disque_monte" != "" ]
  then
    echo "For safety, umount : $nom_disque_monte"
    umount $nom_disque_monte
  fi

}

# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas

echo "--------------------------------"
echo "Install ISO quick address..."
nom_fichier_iso=`ls -t $path_sources_qas | awk '{if (NR==1) {print $1}}'`
echo "Mount disk $nom_fichier_iso..."
mount -o loop -t iso9660 $path_sources_qas/$nom_fichier_iso /mnt/qas
echo "Done."

# All the folders are like this :
# /usr/bin/qas/Data.old.10
# /usr/bin/qas/Data.old.11
# /usr/bin/qas/Data.old.12
# ...

echo "--------------------------------"
echo "Stopping QuickAdress server..."
cd $path_qas_bin/apps/
./wvmgmtd shutdown qaserver:2021
sleep 3
echo "Done."

# Get last number of the folder:
num_dernier_dossier_backup=`ls -Atd $path_qas_bin/Data.old* | awk '{if (NR==1) {print $1}}' | awk -F . '{print $NF}'`
# Add 1 :
let "num_dernier_dossier_backup += 1"
# Full name :
nom_dossier_backup=Data.old.$num_dernier_dossier_backup
echo "--------------------------------"
echo "Saving Data to $nom_dossier_backup..."
cd $path_qas_bin
mv Data $nom_dossier_backup
echo "Done."


echo "--------------------------------"
echo "Copying new folder Data..."
cd $path_qas_bin
cp -r /mnt/qas/Data .
echo "Done."

echo "--------------------------------"
echo "Deleting unused datas..."
cd $path_qas_bin/apps/
rm -f $path_qas_bin/Data/frxmos.dap
echo "Done."

echo "--------------------------------"
echo "Restart server..."
cd $path_qas_bin/apps/
./qaswvd &
sleep 3
echo "Done."
sleep 3

echo "--------------------------------"
echo "Check: server state: you should read 'OK':"
./wvmgmtd srvlist
echo "Done."

echo "--------------------------------"
echo "Check: active licences (only one here):"
./wvmgmtd licencelistread qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: counters: number of addresses left:"
./wvmgmtd counterinforead qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: Datasets avalaibles:"
./wvmgmtd datalistread current qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: "meters" for "licence by click":"
./wvmgmtd meterslistread current qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Removing virtual disk..."
umount_disque_qas
echo "Done."

echo "All done"
echo "Click 'Ctrl-C' to quit."

exit

Ketika saya meluncurkannya melalui SSH, itu berjalan dan pada akhirnya, saya membaca "Semua selesai." jadi ini berarti mencapai 2 baris terakhir .

Tahu bagaimana saya bisa melakukan untuk menutup secara otomatis dan pr


1
Apa yang ada dalam skrip?
Ignacio Vazquez-Abrams

@Olivier: Apakah Anda meneruskan port (termasuk agen dan X)? Koneksi ssh ditutup ketika perintah berakhir dan semua koneksi TCP telah ditutup.
Gilles 'SANGAT berhenti menjadi jahat'

@Gilles: tidak, saya hanya membuat koneksi shell untuk menjalankan skrip, tidak ada yang diteruskan.
Olivier Pons

1
@Olivier: Jika Anda memiliki ~/.ssh/config, coba tanpanya, dan berikan opsi -a -x(dan tidak -o) untuk sshmemastikan tidak ada penerusan yang sedang berlangsung. Jika masih tidak berfungsi, perlihatkan konten skrip.
Gilles 'SANGAT berhenti menjadi jahat'

@Olivier: apakah skrip memulai pekerjaan latar belakang yang sedang menunggu? Sayangnya pekerjaan tampaknya tidak mengembalikan apa pun ketika dalam skrip ssh. Contoh: ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'akan membuat daftar file, menampilkan selesai dan menunggu 10 detik sebelum kembali.
asoundmove

Jawaban:


19

Keluar di skrip shell tidak berfungsi karena keluar dari skrip, bukan shell. Untuk keluar dari shell setelah script selesai dilakukan

ssh user@ipaddress '~/my_script.sh && exit'

Ini akan menjalankan skrip kemudian keluar dari shell.


3
Itu harus keluar. Scriptnya adalah shell.
Dijeda sampai pemberitahuan lebih lanjut.

@ Dennis: Ini tidak berfungsi untuknya jadi ini mungkin bekerja sebagai gantinya.
Wuffers

2
@Bapak. Man: Perintah Anda sama dengan yang asli, kecuali perintah itu memaksa shell ada di antara sshddan shell berjalan myscript.sh. The exitAnda tulis akan bertindak ketika keluar script, yang tidak membantu. Satu-satunya cara solusi Anda bisa bekerja adalah jika skrip melakukan sesuatu yang aneh ketika orang tuanya adalah sshddan tidak melakukan hal yang aneh ketika orang tuanya adalah sebuah shell.
Gilles 'SO- stop being evil'

Bagaimana itu tidak membantu? Keluar akan menutup shell dan mengakhiri koneksi, benar? Dan bukankah ini yang ingin dilakukan poster itu?
Wuffers

3
@ Mr Man: ~/my_script.sh && exitkeluar segera setelah ~/my_script.shkeluar. Jika skrip shell tidak keluar, perintah Anda tidak akan pernah berhasil exitsedikit pun. Jadi tidak ada gunanya.
Gilles 'SANGAT berhenti menjadi jahat'

12

Sambungan ssh tetap terbuka saat proses dimulai dengan ssh (di sini, shell) keluar, jika ada proses lain yang masih menggunakannya. Saya tidak tahu aturan pasti yang mengikuti daemon ssh, tetapi koneksi sedang digunakan, setidaknya, jika output standar dari setiap proses anak masih terhubung ke pipa asli yang disediakan oleh ssh. Membandingkan:

ssh somehost 'sleep 5 &'  # exits after 5 seconds
ssh somehost 'sleep 5 >/dev/null &'  # exits immediately seconds

Ketika Anda memulai daemon, Anda harus latar belakangnya dan tutup deskriptor file-nya. Setidaknya, gunakan ini:

./qaswvd </dev/null >/dev/null 2>/dev/null &

Anda mungkin ingin menambahkan nohupdi depan; itu tidak akan membuat perbedaan di sini tetapi akan berguna jika skrip dijalankan dari terminal. Banyak program yang dirancang untuk bertindak sebagai daemon memiliki opsi baris perintah untuk membuat mereka melakukan fork, menutup deskriptor file, mengabaikan sinyal dan basa-basi lainnya. Periksa di qaswvddokumentasi jika ada. Anda juga dapat menyelidiki utilitas "daemonizer".


Punya masalah yang sama, dan ini berhasil. Jawaban yang diterima tidak berfungsi.
Andy

5

Saya melihat posting ini ketika saya mencari solusi untuk situasi yang sama. Meskipun agak terlambat untuk menyelesaikan masalah @ Oliver, karena jawaban yang diterima jelas tidak berfungsi baik untuk OP atau saya (tidak tahu mengapa itu diterima), saya masih ingin memposting solusi saya sendiri untuk googler masa depan. Sederhana: tambahkan -fopsi dalam sshperintah:

ssh -f user@ipaddress '~/my_script.sh'

EDIT

Efek dari -fopsi adalah untuk diletakkan sshdi latar belakang, jadi tanpa opsi lebih lanjut ditambahkan adalah mungkin bahwa koneksi masih hidup bahkan tampaknya itu rusak. Seseorang dapat merujuk ke jawaban yang diberikan dalam posting lain di situs ini jika tertarik.


Perhatian: Ini (-f) tidak akan berfungsi jika skrip asli memiliki prompt untuk input pengguna.
madD7

3

Seperti Ignacio, saya ingin tahu apa yang ada di naskah Anda.

Mungkin Anda bisa mencoba dan mengurangi skrip Anda menjadi contoh sekecil mungkin yang menghasilkan kondisi kesalahan.

Atau mulai dari skrip kosong dan tambahkan perintah pada satu waktu sampai Anda melihat masalahnya, maka Anda akan tahu perintah apa yang menyebabkan skrip Anda terkunci.

Jika skrip kosong menyebabkan Anda mengalami masalah, Anda mungkin ingin menyelidiki konfigurasi ssh Anda, misalnya, apakah .bash_logout atau beberapa yang dipanggil saat keluar yang dapat menyebabkan masalah?


Terima kasih atas saran Anda, saya sekarang telah menambahkan sampel skrip saya dalam pertanyaan saya.
Olivier Pons

@Olivier: Anda telah menambahkan hanya bagian yang tidak relevan dari skrip Anda. Poskan skrip (dan petunjuk penggunaan jika perlu) yang memungkinkan pembaca mereproduksi masalah Anda . Sederhanakan skrip sebanyak mungkin, tetapi tidak lebih lanjut.
Gilles 'SO- stop being evil'

@Gilles Terima kasih. Saya telah memodifikasi pertanyaan saya dan menambahkan seluruh skrip. Semoga ini membantu. Tampaknya masalahnya mungkin fakta bahwa saya meluncurkan proses latar belakang ( baris "./qaswvd &" ). Mungkinkah ini penyebab masalah?
Olivier Pons

1
@Olivier: Ya, proses utama Anda akan menunggu proses latar belakang berhenti sebelum keluar. Jika Anda ingin sesuatu tetap berjalan setelah Anda keluar, Anda mungkin ingin mencoba nohup. Tidak yakin ini bekerja dengan ssh, tetapi cobalah saja tidak akan sakit.
asoundmove

2

Anda mungkin menggunakan pekerjaan dalam skrip Anda. Jika itu kasus shell hanya menunggu pekerjaan Anda selesai dan tidak ingin melepaskan diri.

Saya tidak akan memposting ulang, hanya akan meneruskan Anda http://en.wikipedia.org/wiki/Nohup#Existing_jobs


Saya telah memodifikasi pertanyaan saya dan menambahkan seluruh skrip. Semoga ini membantu. Tampaknya masalahnya mungkin fakta bahwa saya meluncurkan proses latar belakang (baris "./qaswvd &"). Jika Anda benar, ini bisa menjadi asal masalah?
Olivier Pons

Proses berlatar belakang adalah masalahnya, tetapi nohuptidak secara langsung masalah di sini karena tidak ada terminal di sisi server: Saya pikir pelakunya secara khusus adalah deskriptor file terbuka.
Gilles 'SANGAT berhenti menjadi jahat'

Yap, saya pikir itu masalahnya, Anda dapat mencoba mengomentari itu atau menerapkan
retasan


0

Masalahnya kemungkinan adalah baris berikut.

./qaswvd &

Perintah ini mungkin masih berjalan dan akan membuat pipa ssh terbuka sampai stdin dan stdout & stderr ditutup.

Gunakan ini sebagai gantinya:

./qaswvd </dev/null >/dev/null 2>&1 &
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.