Ssh ile, uzaktaki makineden çıkmadan bir komutu nasıl çalıştırabilirsiniz?


29

Normalde, ssh komutunu böyle iletirseniz,

ssh me@example.com 'some-command.sh'

Etkileşimli olmayan bir oturum elde edersiniz ve ssh, komut (veya komut dosyası ya da her neyse) çalıştırıldığı anda çıkar. Etkileşimli bir oturumu nasıl alabilirim ve yine de yerel makinemden belirttiğim bir komutu çalıştırabilirim. Örneğin, ekranı açıp belirli bir ekran oturumunu yeniden başlatmak istiyorum:

ssh me@example.com 'screen -r 12345'

ancak buna izin verilmez, "Terminale bağlanmalı" hatası verilir. temelde "bu komutu etkileşimli bir kabuktan çağırmalısınız" anlamına geldiğini tahmin ediyorum.

Başka bir örnek olarak, işyerinde bazı şeyleri yapma haklarına sahip olmak için sık sık paylaşılan bir hesap kullanmamı gerektiren bir ton makine kullanıyorum (evet biliyorum: kötü bir fikir ama beni suçlama, o şeyleri ayarlamadım yol), ve genellikle varsayılan kabuk olarak ksh var. Giriş yapmak, bash (veya zsh) 'ya geçmek ve kendi hesabımın .bash_profile (veya .zshrc) kaynağını kullanmak istiyorum. Etkileşimli bir ssh oturumu kurabilir ve oturum açtıktan sonra çalıştırmak için uzaktaki makineye bir komut iletebilirsem bu kolay olurdu .

Yayınlayacağım aklımda olmayan ve çok denenmemiş bir çözümüm var, ancak birinin daha iyi bir yol bildiğini umuyorum.

GÜNCELLEME: Bunu anlamayanlar için, hepsini el ile yapmayı planlamıyorum, bu yüzden etkileşimli bir oturum açmamı ve ardından el ile yapmamı hiçbir şey çözmüyor.

2. GÜNCELLEME: Bir kez daha açıklığa kavuşturmak için: Sunucuda (istemcide programlı olarak belirtilen) komutları (rasgele) çalıştırmaya çalışıyorum, ancak daha sonra bu programatik komutlardan yapılan herhangi bir şeyden etkilenen etkileşimli bir oturum açıyorum.


echo "command" | ssh user@remote_host
lafingreflex

2
Sorunun "çıkmadan" bölümünü özlediniz mi? Komut tamamlandıktan sonra bunun çıkacağından eminim.
iconoclast

Yanıtlar:


26

Bash'ı başlatmak ve ssh yaparken kendi profilinizi kaynaklamak için aşağıdaki komutu deneyebilirsiniz:

ssh  -t hostname "bash --rcfile ~user/.bashrc"

4
+1. -tAnahtar ile sorunu olanın sorununu giderir screensıra.
Yamalar

3
Bu, bağlantıyı kapatmadan isteğe bağlı komutlarla kullanılabilir mi? Denersem ssh -t www.dev "echo 'hi there'", komut çalıştırıldıktan hemen sonra bağlantı hemen kesilir.
iconoclast

11

Dogbane'nin cevabına dayanarak tam bir çözüm şöyle görünüyor:

ssh -t user@server 'cd /a/great/place; bash'

Burada -tetkileşimli bir kabuk için gerekli olan sözde-terminalin tahsis edilmesini zorlamak için kullanıyorum . Ardından sunucuda iki komut yürütüyorum: önce etkileşimli kabuğu açmadan önce yapmak istediğim şeyi (benim durumumda dizini belirli bir klasöre değiştirerek) ve sonra etkileşimli kabuğun kendisini. bash, sözde bir terminale sahip olduğunu görüyor ve etkileşimli olarak cevap veriyor.

Tek tırnak, her şeyin uzak sunucuya varsayılan kabuğunuz tarafından çalıştırılacak komut olarak geçirilmesini sağlar.

Dogbane'e gerekli ipucunu sağladığınız için tekrar teşekkürler -t. Ben bu sorunu çözerdim expect, bu kesinlikle bir fareyi topla öldürüyor. (:


2

Bu çözümü dene.

echo "command" | ssh user@remote_host

Giriş etkileşimlidir ve komutunuz, etkileşimli komut satırına yazdığınız gibi iletilir. Oturum, siz yazmışsınız gibi sona erer.

ssh user@remote_host 'command'

3
Komutundan sonra oturumu sonlandırır tamamlandıktan, o zaman bu yok değil soruya cevap. Komutun tek amacı, komutları yalnızca sunuculara göndermek için değil , komut çalıştırıldıktan sonra etkileşimli bir oturumla bırakılmaktır ssh.
iconoclast

Bu, en azından kendi bash dosyanızı kullanmadan, komutun yürütüleceği bir etkileşimi simüle etmek için iyidir -t. +1
laggingreflex

0

TermIO cmds kullanmak için ssh -X tuşunu kullanın.

Ayrıca - cm'lerinizi "ssh 'source ~ / .bashrc && cd && do'" gibi zincirleyebilirsiniz


ama bütün zincir tamamlandıktan sonra, etkileşimli bir oturumum kaldı, değil mi? Hala kapanıyor, değil mi?
iconoclast

Ve termIO çözümü üzerinde durmak ister misiniz?
iconoclast

0

neden yüklemez ayırmak uzaktan sistemi ve kullanımı hakkında:

ssh -t user@example.com "/home/user/bin/detach ls"

Bu çalışma 'ls' ve sonra da beni etkileşimli bir oturumda bırakacak mı? Ya 'yerine' yerine, bazı takma adları ve işlevleri elde etmek için 'source .somefile' komutunu çalıştırıyorum. İnteraktif oturumumda mevcut olacaklar mı yoksa farklı bir oturumda mı yürütülecek?
iconoclast

Hayır, bağlı detach, lsaçık oturumu tutmaz ve çıktısını yazdırmadan kesilir lsama yine de kaçıyorum.
Dan D.

Sunucuda (isteğe bağlı) komutları çalıştırmaya çalışıyorum (istemcide programlı olarak belirtilmiş) ancak daha sonra bu programatik komutlardan yapılan herhangi bir şeyden etkilenen etkileşimli bir oturum açıyorum. Sizi doğru anlarsam, bu bana yardımcı olmuyor.
iconoclast

0

laggingreflex'in cevabı yakın ... Bunu aşağıdaki gibi değiştirirdim:

echo "command\n$(cat -)" | ssh user@remote_host

Ne yazık ki, çalışma şeklini beğenme olasılığınız yok, çünkü "cat" yazdığı satırları stdout'a tamponluyor ... "echo-cat" adında bir şema yaratırsak, şuna benzer:

{
  echo "${@}"
 #cat buffers & won't flush to stdout immediately
 #cat -
  IFS='\n'
  while read line
  do
        echo "${line}"
  done
}

tamponlama olmadan aynı sonucu elde edeceğiz:

echo-cat "command" | ssh user@remote_host

Muhtemelen seni hedefine daha çok yaklaştırır ...


0

Bu çok ağır ve denenmemiş, ama çalışması gerektiğini düşünüyorum.

User @ host argümanından sonra alıntılanan bir argüman alan (örn.) Remote-starter adlı bir komut dosyası oluşturun:

remote-starter user@example.com 'some-command.sh arg1 arg2'

Bu komut dosyası, önce alıntı yapılan komutu (tırnak işaretleri olmadan) .onetimeuzaktaki makinedeki (örn.) Dosyaya kaydetmeli ve daha sonra normal bir ssh komutunu çalıştırmalıdır, bu kez uzak makinede çalıştırılacak herhangi bir komutu geçmemelidir. (Eğer ssh user@example.com bir betiğin içinden çalıştırılıyorsa, exec ssh user@example.com da çalıştırılabilir.)

Bunun çalışması için uzak makinenin .onetime.bash_profile veya .zshrc ya da her neyse kaynağında olması gerekir . Çalıştırdıktan sonra .onetime, onu silmeli .onetime, böylece normal bir giriş yaptığınızda sonraki sefer dosya çalıştırılmaz.

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.