Sizin varsayım temiz olmadığını ssh
kendisini döndürdüğü 255 çıkış durumu doğrudur. ssh
Adam sayfa belirtiyor:
ssh uzak komutun çıkış durumuyla veya bir hata oluşursa 255 ile çıkar.
Basitçe çalışacak ssh pi@10.20.0.10 "pkill -f asdf"
olsaydınız, büyük olasılıkla " Eşleşen işlem yok " durumuna 1
karşılık gelen bir çıkış durumu alırsınız .pkill
Zorlayıcı kısım, çalıştırdığınızda SSH ile neden bir hata oluştuğunu anlamaktır
ssh pi@10.20.0.10 "pkill -f asdf || true"
SSH uzaktan komutları
SSH sunucusu uzak komut (lar) ı çalıştırmak için bir kabuk başlatır. İşte bunun bir örneği:
$ ssh server "ps -elf | tail -5"
4 S root 35323 1024 12 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony [priv]
5 S anthony 35329 35323 0 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony@notty
0 S anthony 35330 35329 0 80 0 - 28283 do_wai 12:01 ? 00:00:00 bash -c ps -elf | tail -5
0 R anthony 35341 35330 0 80 0 - 40340 - 12:01 ? 00:00:00 ps -elf
0 S anthony 35342 35330 0 80 0 - 26985 pipe_w 12:01 ? 00:00:00 tail -5
Not varsayılan kabuk olduğu bash
ve uzaktan komut, basit bir komutu ve bir olmadığını boru hattı , “bir ya da daha fazla, komutlar dizisi kontrol operatörü tarafından ayrılmış |
”.
Bash kabuğu, -c
seçenek tarafından kendisine iletilen komut basit bir komutsa , aslında yeni bir işlem istemeyerek optimize edebileceğini, yani exec
ekstra adımdan geçmek yerine doğrudan basit komut olduğunu anlayacak kadar zekidir. arasında fork
daha önce ing exec
s. Uzaktan basit bir komutu çalıştırdığınızda neler olduğuna bir örnek ( ps -elf
bu durumda):
$ ssh server "ps -elf" | tail -5
1 S root 34740 2 0 80 0 - 0 worker 11:49 ? 00:00:00 [kworker/0:1]
1 S root 34762 2 0 80 0 - 0 worker 11:50 ? 00:00:00 [kworker/0:3]
4 S root 34824 1024 31 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony [priv]
5 S anthony 34829 34824 0 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony@notty
0 R anthony 34830 34829 0 80 0 - 40340 - 11:51 ? 00:00:00 ps -elf
Daha önce bu davranışla karşılaştım ama bu AskUbuntu yanıtı dışında daha iyi bir referans bulamadık .
pkill davranışı
Yana pkill -f asdf || true
basit bir komut (bir var olmayan komut listesi ) çalıştırdığınızda, yukarıdaki optimizasyon böylece oluşamaz ssh pi@10.20.0.10 "pkill -f asdf || true"
, sshd
süreç çatal ve execs bash -c "pkill -f asdf || true"
.
Ctx'in cevabının işaret pkill
ettiği gibi, kendi sürecini öldürmeyecek. Ancak, olacak olan komut satırı ile eşleşen başka öldürme işlemi -f
desen. bash -c
Kendi ebeveyn (tesadüfen de) - bu bu süreci öldürür böylece komut bu kalıbı ile eşleşir.
SSH sunucusu daha sonra uzak komutları çalıştırmak için başlattığı kabuk işleminin beklenmedik bir şekilde öldürüldüğünü görür, böylece SSH istemcisine bir hata bildirir.
pkill
onun arg liste Regexp'i eşleştiği için üst kabuk sürecini öldürür, bir terminoloji itiraz edeceğiz:x || y
olduğu değil bir bileşik komutu , şey komut listesi .