Remote ssh komutunu Full Login Shell ile çalıştır


48

Gibi bir şey yapmak istiyorum ssh example.com 'ls'Ancak ssh manpage:

Eğer komut belirtilirse, bunun yerine bir giriş kabuğunun çalıştırmaktadır edilir.

Öyleyse olan ls, çıktısını görüntüler ve ssh çıkar.

Çözemediğim tam oturum açma kabuğunun nasıl açılacağı ve ardından komutun bu kabuğun içinde çalıştırılmasıdır. Komut çalıştırıldıktan sonra kabuğun açık bırakılması. Sanki elle yapmıştım:

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

Herhangi bir fikir?


bu benzer bir soru superuser.com/questions/261617/… ancak cevapların hiçbiri gerçekten yapmaya çalıştığım şeylere uymuyor gibi görünüyor.
matthew

Ne dersiniz ssh example.com 'ls;bash'?
Andrejs Cainikovs

İkinci kabuğu etkileşimli yapmak için sistemlerimdeki -i'ye ihtiyacınız var.
Flexo

seçenek -t sorunuzun cevabıdır. Diğer seçenekler (örneğin, anahtarlık) mevcuttur, ancak benim için yeterince açık olmayan gerçek ihtiyaçlarınıza bağlıdır.
hornetbzz

@ hornetbzz -t bana yalancı tty verir. Ancak aksi takdirde davranış aynıdır. Etkileşimli bir kabuk başlatmak, o kabuğun içinde bir komut çalıştırmak ve komut çalıştırıldıktan sonra kabuğun açık kalmasını istiyorum.
matthew

Yanıtlar:


40

Sadece bash'a lsve sonra da bir giriş kabuğu içinde kendisini çalıştırmasını söyle

$ ssh user@host  -t 'bash -l -c "ls;bash"'

2
Ne yazık ki bu kullanırken işe görünmüyor screen. Aksi halde, yapmaya çalıştığım şeyi yapıyor gibi görünüyor.
matthew

31
ssh user@host -t 'ls; exec $SHELL -l'

-tSözde-terminal tahsisini zorla. Bu, uzaktaki bir makinede isteğe bağlı ekran tabanlı programları yürütmek için kullanılabilir. Bundan biraz daha uygun bash -i.

exec Yeni bir işlem oluşturulmadı.

-l~ / .bash_profile, ~ / .bash_login ve ~ / .profile öğelerini bu sırada arar ve okur ve bu komutları okur ve yürütür ... Bu olmadan, muhtemelen ~ / bin dizinindeki komut dosyalarını / komutlarını çalıştıramazsınız, çünkü bu kod ~ / .profile dosyasından -lbayrak olmadan çalıştırılamaz :

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

@grawity @Alan Bu bir geçici çözüm olarak işe yarayabilir, ancak gerçekten komutun çalıştırılmasından sonra komutun çalıştırılmasını ve komut çalıştırıldıktan sonra yeni bir kabuk açılmasını istiyorum.
matthew

+1, -t kesinlikle geçmenin doğru yolu -i, sadece unuttum.
Flexo

@ mattthew: Buna bashizin vermek için kendinizi yama etmeniz gerekecek .
Grawity

@grawity gerçekten değil, aşağıdaki cevabımı görün
fons

@ matthew, kullanın exec bashveyaexec $SHELL
Eugen Konkov

1

Fons'un cevabı hakkındaki yorumunuzda, kullanım sırasında çalışmadığını söylersiniz screen.

Bunu açıklayabilir misiniz? Openssh için kaynak koduna bakarak sshd komutu çağırarak çalıştırır.

YOUR_DEFAULT_SHELL -c COMMAND

Varsayılan kabuk ise Yani, örneğin, screendaha sonra bu iyi çünkü hepsi işe yaramaz screenbireyin -cbayrak sadece kendi geçersiz kılar .scrreenrc. Bu yüzden, eğer varsayılan kabuğunuz buysa, ekrana komut göndermenin bir yolu yok. Aslında ekranı ssh'ye verilen komut olarak çalıştırmanız gerekecek, ancak ekran olmayan varsayılan bir kabuk ile .

Yapmaya çalıştığınız şey buysa, bence işler gerçekten garipleşir, çünkü screenetkileşimli olmayan programları da içeren pencereleri kapatır, bu yüzden fons'lara benzer bir numara yapmak zorunda kalırsınız, ancak bir seviye daha derin. SO, örneğin , varsayılan kabuk olarak / bin / bash (ve ekran değil) gibi bir şey:

ssh user@host -t 'screen bash -l -c "ls;bash"'

Hangisi - derin bir nefes almalı-- ana bilgisayara ssh, bash -c komutunu çalıştırın, ekran komutuyla yeni bir pencere açın. Bu pencere açıldıysa ls sona erecek ve ekran sonlanacak, bu yüzden fons hilesini yeni ekran penceresinin içinde kullanıyoruz .

Yapmaya çalıştığınız şey buysa bile çalışacağını düşünüyorum;)


Ben var sorun düşünmek screenbu durumda, normalde ile yük olduğunu exec screen -RRne biz den .profile. Bu bash -l, geri kalanını fırlatan ekranı yüklemeye çalıştığı anlamına gelir . Sanırım hem sizin hem de @fons çözümlerinde '-l' işaretini kaldırarak halledebilirim screen. Yine de biraz garipti.
matthew

0

Çoklu t seçenekleri, ssh'nin yerel tty'si olmasa bile tty tahsisini zorlar:

ssh -tt user@host 'bash -l -c "/path/to/command'
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.