Sizin varsayım temiz olmadığını sshkendisini döndürdüğü 255 çıkış durumu doğrudur. sshAdam 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 1karşı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 bashve 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, -cseçenek tarafından kendisine iletilen komut basit bir komutsa , aslında yeni bir işlem istemeyerek optimize edebileceğini, yani execekstra adımdan geçmek yerine doğrudan basit komut olduğunu anlayacak kadar zekidir. arasında forkdaha önce ing execs. Uzaktan basit bir komutu çalıştırdığınızda neler olduğuna bir örnek ( ps -elfbu 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 || truebasit 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", sshdsüreç çatal ve execs bash -c "pkill -f asdf || true".
Ctx'in cevabının işaret pkillettiği gibi, kendi sürecini öldürmeyecek. Ancak, olacak olan komut satırı ile eşleşen başka öldürme işlemi -fdesen. bash -cKendi 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.
pkillonun arg liste Regexp'i eşleştiği için üst kabuk sürecini öldürür, bir terminoloji itiraz edeceğiz:x || yolduğu değil bir bileşik komutu , şey komut listesi .