ssh ve ssh ile kabuk: çıkış nasıl?


22

SSH üzerinden şu şekilde bir komut dosyası çalıştırıyorum:

ssh user@ipaddress '~/my_script.sh'

Her şey yolunda gidiyor ama komut dosyası bittikten sonra bağlantı kapanmıyor. Geçerli bağlantıyı kesmek için CTRL-C tuşlarına basmam gerekiyor.

'~ / My_script.sh' içinde "exit" komutunu denedim ve işe yaramaz. '~ / My_script.sh' içinde "çıkış" komutunu denedim ve bir mesaj alıyorum:

logout: not login shell: use exit

...

Senaryo bittikten sonra SSH otomatik ve düzgün bir şekilde kapatmak için nasıl bir fikir?

(Açıklama için değişiklik :) İşte senaryomun içindekiler:

#!/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

SSH ile başlattığımda çalışıyor ve sonunda "Her şey bitti" yazısını okuyorum . yani son 2 satıra ulaşır .

Otomatik olarak kapatmak için nasıl bir fikir ve pr


1
Senaryoda ne var?
Ignacio Vazquez-Abrams

@Olivier: Herhangi bir portu yönlendiriyor musunuz (ajan ve X dahil)? Komut sona erdiğinde ve tüm TCP bağlantıları kapatıldığında ssh bağlantısı kapatılır.
Gilles 'SO- kötülüğü bırak'

@Gilles: hayır Ben sadece bir komut dosyası çalıştırmak için bir kabuk bağlantı yapmak, hiçbir şey iletilmez.
Olivier Pons

1
@Olivier: Eğer varsa ~/.ssh/config, onsuz deneyin ve devam eden bir yönlendirme olmadığından emin olmak için seçenekleri -a -x(ve hayır -o) iletin ssh. Hala çalışmıyorsa, komut dosyasının içeriğini gösterin.
Gilles 'SO- kötü olmayı bırak

@Olivier: komut dosyası beklediği herhangi bir arka plan işini başlatıyor mu? Ne yazık ki işler bir ssh komut dosyasında hiçbir şey döndürmüyor gibi görünüyor. Örnek: ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'dosyaları listeler, görüntü tamamlanır ve geri dönmeden önce 10 saniye bekler.
asoundmove

Yanıtlar:


19

Kabuk komut dosyasından çıkış, kabuktan değil komut dosyasından çıktığı için çalışmaz. Komut dosyası tamamlandıktan sonra kabuktan çıkmak için

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

Bu komut dosyasını çalıştıracak ve kabuktan çıkacaktır.


3
Çıkıyor olmalı. Komut olan kabuk.
sonraki duyuruya kadar duraklatıldı.

@Dennis: Onun için çalışmıyor, bu yüzden bunun yerine işe yarayabilir.
Wuffers

2
@Bay. Adam: Komutunuz, bir kabuğun varlığını sshdve kabuğun çalışmasını zorlaması dışında, orijinaline eşdeğerdir myscript.sh. exitYardım komut çıkar, değil hangi zaman yazdığın hareket edecektir. Çözümünüzün çalışabilmesinin tek yolu, komut dosyasının üst öğesi sshdolduğunda tuhaf bir şey yapması ve üst öğesi bir kabuk olduğunda o tuhaf şeyi yapmamasıdır.
Gilles 'SO- kötü olmayı bırak

Nasıl yardımcı olmaz? Çıkış kabuğu kapatır ve bağlantıyı keser, değil mi? Ve posterin yapmak istediği bu değil mi?
Wuffers

3
@MrMan: ~/my_script.sh && exiten kısa sürede ~/my_script.shçıkar. Kabuk betiği çıkmazsa, komutunuz asla bitmeyecektir exit. Yani işe yaramaz.
Gilles 'SO- kötü olmayı bırak

12

Hala kullanmakta olan başka işlemler varsa, ssh (burada bir kabuk) tarafından başlatılan işlem çıktığında ssh bağlantısı açık kalır. Ssh daemon'un takip ettiği kesin kuralları bilmiyorum, ancak en azından herhangi bir alt sürecin standart çıktısı hala ssh tarafından sağlanan orijinal boruya bağlıysa, bir bağlantı kullanılıyor. Karşılaştırmak:

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

Bir arka plan programı başlattığınızda, arka planı başlatmalı ve dosya tanımlayıcılarını kapatmalısınız. En azından şunu kullanın:

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

nohupÖnde eklemek isteyebilirsiniz ; burada bir fark yaratmaz, ancak komut dosyası bir terminalden çalıştırılırsa yararlı olur. Daemon gibi davranmak için tasarlanmış birçok program, onları çatal, dosya tanımlayıcıları kapatmak, sinyalleri ve diğer incelikleri yoksaymak için bir komut satırı seçeneklerine sahiptir. qaswvdVarsa belgeleri kontrol edin . “Daemonizer” yardımcı programlarını da araştırabilirsiniz.


Aynı sorun vardı ve bu işe yarıyor. Kabul edilen cevap çalışmıyor.
Andy

5

Bu durumu aynı durumun çözümü için araştırdığımda gördüm. @ Oliver'ın problemini çözmek için biraz geç olsa da, kabul edilen cevap OP veya bana açık bir şekilde çalışmadığı için (neden kabul edildiğini bilmiyorum), yine de gelecekteki googler için kendi çözümümü göndermek istiyorum. Çok basit: komutta bir -fseçenek ekleyin ssh:

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

DÜZENLE

-fSeçeneğin etkisi ssharka plana koymaktır , bu nedenle başka bir seçenek eklenmeden, kopmuş gibi görünse bile bağlantının hala canlı olması mümkündür. İlgiliyse , bu sitedeki başka bir gönderide verilen cevaba atıfta bulunabilirsiniz .


Dikkat: Orijinal komut dosyasının kullanıcı girişi istemi varsa bu (-f) çalışmaz.
madD7

3

Ignacio gibi senaryonuzda ne olduğunu merak ediyorum.

Belki de betiğinizi hata koşulunu üreten en küçük örneğe indirmeyi deneyebilirsiniz.

Veya boş bir komut dosyasından başlayın ve sorunu görene kadar her seferinde bir komut ekleyin, ardından hangi komutun komut dosyanızın kilitlenmesine neden olduğunu bilirsiniz.

Boş komut dosyası size bir soruna neden oluyorsa, ssh yapılandırmanızı incelemek isteyebilirsiniz, örneğin .bash_logout veya çıkışta çağrılan bir sorun olabilir.


Öneriniz için teşekkürler, şimdi soruma senaryomun örneğini ekledim.
Olivier Pons

@Olivier: Senaryonuzun yalnızca alakasız kısımlarını eklediniz. Okuyucuların sorununuzu yeniden üretmesine olanak tanıyan bir komut dosyası (ve gerekirse kullanım talimatları) gönderin . Betiği olabildiğince basitleştirin, ancak daha fazla değil.
Gilles 'SO- kötü olmayı kes

@Gilles Teşekkürler. Sorumu değiştirdim ve tüm senaryoyu ekledim. Bu yardımcı olur umarım. Sorun, bir arka plan işlemi ( "./qaswvd &" satırı) başlattığım gerçeği gibi görünüyor . Bu sorunun kaynağı olabilir mi?
Olivier Pons

1
@Olivier: Evet, ana işleminiz çıkmadan önce arka plan işleminin durmasını bekleyecektir. Çıktıktan sonra bir şeyin çalışmaya devam etmesini istiyorsanız nohup'u denemek isteyebilirsiniz. Ssh ile çalıştığından emin değilim, ama incitmeyecek bir deneyin.
asoundmove

2

Muhtemelen betiğinizdeki işleri kullanabilirsiniz. Durum buysa, işlerinizin bitmesini bekler ve kendini ayırmak istemez.

Yeniden yayınlamayacağım, sadece sizi yönlendireceğim http://en.wikipedia.org/wiki/Nohup#Existing_jobs


Sorumu değiştirdim ve tüm senaryoyu ekledim. Bu yardımcı olur umarım. Sorun, bir arka plan işlemi ("./qaswvd &" satırı) başlattığım gerçeği gibi görünüyor. Haklıysanız, bu sorunun kaynağı olabilir mi?
Olivier Pons

Arka plandaki süreç sorun, ama nohupsunucu tarafında hiçbir terminali yok gibi doğrudan burada sorun değil: Ben suçlu özellikle açık dosya tanımlayıcı olduğunu düşünüyorum.
Gilles 'SO- kötü olmayı bırak'

Evet, bence sorun bu, yukarıdaki bağlantıdan
hack'i yorumlamaya çalışabilirsin


0

Sorun muhtemelen aşağıdaki satırdadır.

./qaswvd &

Bu komut muhtemelen hala çalışıyor ve stdin ve stdout & stderr kapatılana kadar ssh borusunu açık tutacak.

Bunun yerine şunu kullanın:

./qaswvd </dev/null >/dev/null 2>&1 &
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.