GNU/Linux >> Znalost Linux >  >> Linux

`ssh <host>` je přihlašovací shell, ale `ssh <host> <příkaz>` není?

OpenSSH (s největší pravděpodobností to, co spouštíte) rozhoduje o tom, zda vytvořit přihlašovací shell či nikoli, a to pouze v případě, že nespouštíte konkrétní příkaz. Od man ssh :

 If command is specified, it is executed on the remote host instead of a
 login shell.

Je to tedy volba implementace pro ssh server, zda chce vytvořit přihlašovací shell nebo ne, a pokud zadáte příkaz ke spuštění, nebude.

Zatímco ssh provede přihlášení, pokud jej necháte provést příkaz a ukončit, je to opravdu mnohem více podobné vytvoření shellu pouze pro spuštění tohoto příkazu než získání přihlašovacího prostředí. Vzhledem k tomu se zdá, že lidé, kteří píší OpenSSH, se rozhodli s ním zacházet jako s tímto druhem úkolu.

Vytvářejí neinteraktivní, nepřihlašovací shell pro provedení příkazu, protože to je duch spouštění příkazu v jiném kontextu/shellu. Normálně by však neinteraktivní shelly automaticky negenerovaly ~/.bashrc což se tady zjevně děje. bash se nám tady snaží pomoci. Z dokumentů

Vyvoláno vzdáleným démonem shellu

Bash se pokouší určit, kdy je spuštěn se svým standardním vstupem připojeným k síťovému připojení, jako když je spuštěn vzdáleným shellovým démonem, obvykle rshd, nebo bezpečným shellovým démonem sshd. Pokud Bash zjistí, že je spuštěn tímto způsobem, čte a provádí příkazy z ~/.bashrc, pokud tento soubor existuje a je čitelný. Neudělá to, pokud je vyvoláno jako sh. Volba --norc může být použita k potlačení tohoto chování a volba --rcfile může být použita k vynucení čtení jiného souboru, ale ani rshd ani sshd obecně nevyvolávají shell s těmito volbami ani neumožňují jejich specifikaci.


proč toto chování leží na nižší úrovni než shelly:ssh host (případ "login shell") používá pseudoterminál na vzdáleném hostiteli pro komunikaci mezi sshd serverový proces a shell; ssh host command používá potrubí mezi sshd a command , namísto. Pseudoterminály jsou nezbytné k interaktivnímu použití interpretu příkazů, jako je shell, nebo režim „read-eval-print“ skriptovacího jazyka; implementují spoustu lidsky přívětivých funkcí, jako je schopnost backspace přes překlepy. Mají však větší režii a (v závislosti na konfiguraci) neumožňují průchod libovolným datům v nezměněném stavu, takže se SSH vyhýbá jejich použití, když nebude probíhat interakce.

Někdy se heuristika příkazu/žádného příkazu SSH pokazí; lze jej přepsat pomocí -t a -T přepínače. Například pro přihlášení ke vzdálenému počítači a okamžité opětovné připojení pozastaveného screen relaci, musíte provést ssh -t host screen -R; ssh host screen -R způsobí screen stěžovat si, že není připojen k terminálu. Nenapadá mě situace, kdy byste vlastně chtěli použít -T , ale je to tam, pokud nějaké najdete.


Linux
  1. Příkaz nebyl nalezen v Zsh, ale nalezen v Bash?

  2. id:příkaz nenalezen

  3. w:příkaz nenalezen

  1. df:příkaz nenalezen

  2. du:příkaz nenalezen

  3. Příkaz Linux pro kontrolu, zda je spuštěn skript shellu nebo ne

  1. Náhrada příkazů:rozdělení na nový řádek, ale ne mezera?

  2. Kruhové odkazy na názvy ve funkci Bash Shell, ale ne v Ksh?

  3. Příkaz Conda pracuje v příkazovém řádku, ale ne ve skriptu bash