GNU/Linux >> Znalost Linux >  >> Linux

Jak se analyzují argumenty vzdáleného příkazového řádku Ssh?

Viděl jsem otázky a odpovědi týkající se potřeby dvojitého úniku argumentů pro vzdálené příkazy ssh. Moje otázka zní:Kde a kdy přesně se provede druhá analýza?

Pokud spustím následující:

$ ssh otherhost pstree -a -p

Ve výstupu vidím následující:

  |-sshd,3736
  |   `-sshd,1102
  |       `-sshd,1109
  |           `-pstree,1112 -a -p

Nadřazený proces pro vzdálený příkaz (pstree ) je sshd , nezdá se, že by tam byl žádný shell, který by analyzoval argumenty příkazového řádku na vzdálený příkaz, takže se nezdá, že by bylo nutné dvojité uvozování nebo escapování (ale rozhodně je). Pokud místo toho nejprve tam ssh a získám přihlašovací shell a poté spustím pstree -a -p Ve výstupu vidím následující:

  ├─sshd,3736
  │   └─sshd,3733
  │       └─sshd,3735
  │           └─bash,3737
  │               └─pstree,4130 -a -p

Je tedy jasné, že existuje bash shell tam, který by v tomto případě provedl analýzu příkazového řádku. Ale v případě, kdy používám přímo vzdálený příkaz, se nezdá, že by tam byl shell, tak proč je nutné dvojité uvozování?

Přijatá odpověď:

Vždy existuje vzdálená skořápka. V protokolu SSH klient odešle serveru řetězec ke spuštění. Klient příkazového řádku SSH vezme své argumenty příkazového řádku a zřetězí je s mezerou mezi argumenty. Server vezme tento řetězec, spustí přihlašovací shell uživatele a předá mu tento řetězec. (Přesněji:server spustí program, který je registrován jako uživatelský shell v uživatelské databázi, a předá mu dva argumenty příkazového řádku:-c a řetězec odeslaný klientem. Shell není vyvolán jako přihlašovací shell:server nenastaví nultý argument na řetězec začínající - .)

Není možné obejít vzdálený shell. Protokol nemá nic jako odesílání pole řetězců, které by bylo možné analyzovat jako pole argv na serveru. A SSH server neobejde vzdálený shell, protože by to mohlo být bezpečnostní omezení:použití omezeného programu jako uživatelského shellu je způsob, jak poskytnout omezený účet, který smí spouštět pouze určité příkazy (např. účet pouze rsync nebo účet pouze pro git).

Shell v pstree možná nevidíte protože to už může být pryč. Mnoho shellů má optimalizaci, kdy pokud zjistí, že se chystají provést „spustit tento externí příkaz, počkat na jeho dokončení a ukončit se se stavem příkazu“, shell spustí „execve tohoto externího příkazu“. To je to, co se děje ve vašem prvním příkladu. Porovnejte následující tři příkazy:

ssh otherhost pstree -a -p
ssh otherhost 'pstree -a -p'
ssh otherhost 'pstree -a -p; true'

První dva jsou totožné:klient posílá na server přesně stejná data. Třetí odešle příkaz shellu, který přeruší optimalizaci exec shellu.

Související:Jaký je rozdíl mezi zámky otáčení a semafory?
Linux
  1. Nagios:Jak povolit argumenty příkazového řádku check_nrpe

  2. Jak připojit vzdálený hostitel pomocí příkazu ssh

  3. Jak používat funkce shellu příkazového řádku v Linuxu

  1. Jak získat stav ukončení příkazu shellu používaného v GNU Makefile?

  2. Jak se změny velikosti terminálu odesílají do aplikací příkazového řádku přes ssh nebo telnet?

  3. Získejte první řádek výstupu příkazu shellu

  1. Jak mohu zadat heslo SSH do SVN na příkazovém řádku?

  2. Jak získat adresu URL souboru Dropbox z příkazového řádku?

  3. Jak vzdáleně spustit příkaz ssh a příkaz sudo bez hesla