Neden sshd, ssh istemcisinin argümanını etkileşimli bir program izlediğinde sahte bir terminal kullanmıyor?


11

Bir SSH sunucusuna bağlanmanın normal yolu ssh username@ip_address. Ancak bir kullanıcı yalnızca uzak makinede bir program çalıştırmak isteyebilir. Böylece program adı normal argümandan sonra gelir ssh username@ip_address <program_name>. Örneğin ssh username@ip_address ls,. Bu argüman, etkileşimli programlar (kullanıcı girişini kabul etmenin yanı sıra çıktı sağlamayı da kabul eder) dışında iyidir top. Çıktı

TERM ortam değişkeni ayarlanmadı.

bu, sshd ve üst programlar arasında hiçbir (sözde) terminalin bağlı olmadığı anlamına gelir. Çözüm, -ttüm komutun şimdi olduğu yere argüman eklemektir ssh -t username@ip_address top.

Benim sorum neden sshd varsayılan olarak etkileşimli olmayan programlarla iletişim kurmak için sahte bir terminal kullanamaz, bu yüzden etkileşimli programlar için -targüman eklemeye gerek yoktur ?


3
Kısa cevap "çünkü genellikle istediğiniz şey bu değildir".
Celada

Sorunuzun aslında bir fikir yalvarması / bir yakınma yapması nedeniyle denetleneceğini tahmin ediyorum. Ama şu soruyu tersine çevirelim: ssh neden tty kaynaklarını büyük bir çoğunluğunda gerekmediğinde tahsis etsin? GERÇEK soru şudur: Neden bir varsayılan veya ana bilgisayara özgü varsayılan yapabilmeniz için force-tty ayırması bir yapılandırma seçeneği değildir?
Mart'ta Otheus

@Otheus O ise yapılandırma seçeneği. Ayarlayabilirsiniz RequestTTY yes(ya forceda config).
Jakuje

Gerçekten. Kısa bir süre sonra 6 yılında tanıtılmış gibi görünüyor ama adamcağız. Sadece çok eski dağıtımları kullanıyorum. :)
Mart'ta Otheus

6
SSH, bir programın etkileşimli olduğunu nasıl güvenilir bir şekilde bilebilir? topToplu modda bile çalışabilir.
muru

Yanıtlar:


18

Diğerlerinin söylediği gibi, PTY'lerin belirli bir ek yükü olduğu doğrudur - ancak uzaktan komut çalıştırırken PTY kullanmamanın en büyük nedeni bilgi kaybetmenizdir.

Normalde, bir komutu ssh üzerinden uzaktan çalıştırdığınızda, komutlar stdoutve stderrakışlar yerel olarak gönderilir stdoutve stderrbu da bunları ayrı olarak yeniden yönlendirebileceğiniz / yönlendirebileceğiniz anlamına gelir - örneğin:

$ ssh server ls foo bar
ls: cannot access bar: No such file or directory
foo
$ ssh server ls foo bar > stdout 2> stderr
$ cat stdout
foo
$ cat stderr
ls: cannot access bar: No such file or directory

Ancak bir PTY kullanırsanız stdout, PTY'lerin çıkış / hata için ayrı akışları olmadığından tüm çıktılar gider :

$ ssh -t server ls foo bar > stdout 2> stderr
$ cat stdout
ls: cannot access bar: No such file or directory
foo
$ cat stderr
$

Bu farkında olmadığım iyi bir nokta.
Jakuje

1
@ThomasDickey: Bu zor ... soru 'neden "bu temerrüt geliştiricilerin tercih ardındaki tarihsel nedeni ne", ama değil olamaz (vurgu benim, ama bir uçbirimsi varsayılan olarak kullanmak SSHD' ifadeler sorudan aşağı yukarı doğrudandır). Bu nedenle, davranıştaki fark (bir dizi komut dosyası deyimini kıracak), geliştiricilerin bu seçimi nasıl yaptığından bağımsız olarak önemlidir :-)
psmears

2
@ThomasDickey: Soruyu bile okudun mu? Geliştiricilerin görüşlerinden nerede bahsediyor?
psmears

1
Belirli bir avantajı üzerinden + 1 puan olmayan bir PTY (performansı dışında) kullanılarak. Yine -tde bunun varsayılan olması gerektiğini ve bunu kapatmak için gerekli bir seçenek olduğunu iddia edebilirsiniz , bu yüzden gerçekten küçük performans avantajı, önemli olmadığı durumlar için benim için en anlamlı olan şeydir.
Peter Cordes

7

Manuel sayfa sshbunu açıklar:

Kullanıcının kimliği sunucu tarafından kabul edildiğinde, sunucu verilen komutu etkileşimli olmayan bir oturumda yürütür veya herhangi bir komut belirtilmemişse, makinede oturum açar ve kullanıcıya etkileşimli oturum olarak normal bir kabuk verir . Uzak komut veya kabuk ile tüm iletişim otomatik olarak şifrelenir.

Özelliktir ve muhtemelen tarihsel rshdavranış nedenlerinden kaynaklanır . Oldukça makul. Komutların çoğu gerçekten etkileşimli değildir ve PTY'yi (20 yıl önce daha önemli olan) tahsis etmek serbest bir işlem değildir.


Kaynak sorunları mantıklıdır, ancak rshprogramın karşılık gelen seçeneği olmadığı için hakkındaki yorum belirsizdir.
Thomas Dickey

@ThomasDickey ben hiç kullanmadım rsh, ama kesinlikle bazı etkisi olmayan seçeneklerinde fakat davranışları orada, orada rshve rlogin(orada komut olup olmadığını). Rsh kullanarak etkileşimli bir komut (rogue (6) veya vi (1) gibi) çalıştıramazsınız; onun yerine rlogin (1) kullanın. .
Jakuje

1

sshÇağırdığınız komutun etkileşimli olup olmadığını nasıl söyleyebiliriz?

Unix olmayan bir işletim sistemi çalıştıran bir makineye giriş yapabileceğinizi fark ettiğinizde bu kabus daha da kötüleşir.

Kolay bir çözüm olmadığı için bir vakanın varsayılan olması gerekiyordu.


Bilmiyor. Bilmiyor. Bu nedenle, bu durumlarda davranışı tanımlayan manuel sayfamız var.
Jakuje
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.