it-swarm-eu.dev

Provádějte vzdálené příkazy zcela odpojené od ssh připojení

Mám 2 počítače, localpc a remoteserver.

Potřebuji localpc k provedení některých příkazů na remoteserver. Jednou z věcí, které musí udělat, je spustit záložní skript, který běží několik hodin. Chtěl bych, aby příkaz na localpc „vystřelil“ a poté běžel zcela nezávisle na remoteserver, jako by localpc nebyl na prvním místě.

Toto jsem zatím udělal:

remoteserver obsahuje skript:

/root/backup.sh

localpc je naplánováno na spuštění tohoto:

ssh [email protected] 'Nohup /root/backup.sh' &

Dělám to správným způsobem? Existuje lepší způsob, jak toho dosáhnout? Budu se tímto způsobem potýkat s problémy?

53
LVLAaron

Pravděpodobně byste měli použít screen na vzdáleném hostiteli, abyste měli skutečný odpojený příkaz:

ssh [email protected] screen -d -m ./script
50
enzotib

Blízko, ale ne přesně.

Nezávisle na jakémkoli terminálu

ssh [email protected] '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'

Musíte zavřít všechny popisovače souborů, které jsou připojeny k ssh soketu, protože relace ssh se nezavře, dokud některý vzdálený proces nemá soket otevřený. Pokud vás nezajímá výstup skriptu (pravděpodobně proto, že se skript sám stará o zápis do souboru protokolu), přesměrujte jej na /dev/null (ale všimněte si, že tím dojde ke skrytí chyb, jako například nemožnosti spustit skript).

Použití Nohup zde nemá žádný užitečný efekt. Nohup zařídí, aby program, který spustí, nepřijal signál HUP, pokud ovládací terminál programu zmizí, ale zde není vůbec žádný terminál, takže nic nebude posílat SIGHUP do procesu mimo modrý. Nohup také přesměruje standardní výstup a standardní chybu (ale ne standardní vstup) do souboru, ale pouze v případě, že jsou připojeny k terminálu, což opět není.

Odpojení od terminálu

 [email protected]$ ssh [email protected]
 [email protected]# Nohup /root/backup.sh </dev/null &
 Nohup: appending output to `Nohup.out'
 [1] 12345
 [email protected]# exit
 [email protected]$ 

Pomocí Nohup oddělte skript od jeho ovládacího terminálu, aby nedostal SIGHUP , když terminál zmizí. Nohup také přesměruje standardní výstup skriptu a standardní chybu do souboru s názvem Nohup.out pokud jsou připojeny k terminálu; musíte se starat o standardní vstup sami.

Vedení vzdáleného terminálu

Pokud chcete zachovat příkaz spuštěný ve vzdáleném terminálu, ale nechat jej připojený k relaci SSH, spusťte jej v multiplexeru terminálu, jako je Screen nebo Tmux .

ssh [email protected] 'screen -S backup -d -m /root/backup.sh'

Později se můžete znovu připojit k terminálu, na kterém je spuštěn skript, vyvoláním screen -S backup -rd jako root na tomto počítači.

Automatizace jednoho vzdáleného příkazu

Pro mírně lepší zabezpečení neotevírejte příliš vzdálené přihlašování ke vzdálenému rootovi. Vytvořte účelový pár klíčů a udělejte mu vynucený příkaz v /root/.ssh/authorized_keys . Obsah souboru veřejného klíče je AAAA…== [email protected]; přidat seznam možností oddělených čárkami včetně command="…", které určuje, že klíč lze použít pouze k provedení tohoto specifického příkazu. Nezapomeňte ponechat možnosti a klíč na jednom řádku.

command="/root/backup.sh </dev/null >/dev/null 2>/dev/null &",no-port-forwarding,no-agent-forwarding,no-x11-forwarding,no-pty,no-user-rc AAAA…== [email protected]

Standardní recept na spuštění vzdáleného příkazu ze vzdáleného přihlášení, jako je SSH, je následující:

Nohup command </dev/null >command.log 2>&1 &

Pokud command je skript Shell, který se stará o protokolování do samotného souboru, můžete command.log to /dev/null. Jakmile to začnete, okamžitě se odhlaste.

Na této lince potřebujete všechno.

Nohup říká Shell, aby proces nerušil, pokud je přihlašovací relace odpojena.

</dev/null říká, že nikdy nebude čekat na vstup

>command.log řekne tomu, aby poslal jakékoli zprávy do tohoto pojmenovaného souboru protokolu

2>&1 řekne tomu, aby poslal jakékoli stderr zprávy do stejného souboru protokolu. V některých případech je lepší mít dva soubory, druhý sbírat chybové zprávy a první sbírat normální zprávy o činnosti. To může usnadnit ověření, že vše fungovalo správně.

& řekne tomu, aby tento proces odpojil a spustil na pozadí jako proces démona.

12
Michael Dillon

Toto vlákno bylo velmi užitečné, ale moje řešení muselo být trochu jiné.

Nelíbí se mi řešení obrazovky, protože opouští proces obrazovky, který nepotřebuji. Přesměrování a nohups se používají takto:

ssh [email protected] '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'

při použití s ​​příkazem ssh NEPracovali.

Na vzdáleném počítači jsem vytvořil skript wrapper, který spouští skutečný skript. Obálka skriptu nastaví přesměrování a Nohup. Něco takového:

backupwrapper.sh:
Nohup backup.sh > /dev/null 2>&1 &

Poté na svém klientském počítači spustím (nevšímejte si přesměrování):

# ssh remotemachine "backupwrapper.sh"
#

Příkaz ssh se okamžitě vrátí, připojení se ukončí a skript zůstane spuštěn.

11
rui

Jak říká Nils , je to bezpečnostní riziko, které umožňuje rootovi přihlásit se přes ssh. A nedoporučuji provozovat žádnou podstatnou práci na stroji bez protokolu. Pokud se něco pokazí, přejete si, abyste dostali nějaké zprávy o řešení problémů. Existují další odpovědi, které vám ukážou, jak to udělat. Ale tady je návod, jak doporučit splnění toho, co jste požadovali. Je to vše zabudováno do sh (1). Není potřeba obrazovka GNU (i když si myslím, že je to chytré řešení). Připojte tento řetězec k vašemu příkazu: >&- 2>&- <&- &. >&- znamená blízký stdout. 2>&- znamená blízký stderr. <&- znamená blízký stdin. & znamená běh na pozadí, např.

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$
6
tbc0

Měli byste pozadí vzdáleného příkazu na remoteserver. Způsob, jakým to provedete, bude na pozadí příkazu ssh na localpc.

Kromě toho je špatný nápad povolit root-ssh.

Takže nastavení na remoteserver: Linka sudoers, která bude běžet /root/backup.sh jako root uživatelem backup.

Tento uživatel byste mohli vytvořit bez „dobrého“ hesla.

Zadejte příkaz Sudo /root/backup.sh & jako příkaz do ~backup/.ssh/authorized_keys - společně s veřejným klíčem od localpc (kdokoli spustí tento skript).

0
Nils