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.