Portál AbcLinuxu, 30. dubna 2025 20:24
Následující krátký skriptík provede na všech serverech ze seznamu přes ssh apt-get update & upgrade. Určeno pro Debian/Ubuntu a jiné DEB distribuce.
Jak udržujete servery aktualizované? Dáváte to do cronu, nebo snad používáte nějaký software pro (vzdálenou) správu?
Skript by potřeboval vylepšit -- asi největší bolístkou je momentálně spouštění příkazu v neterminálovém režimu (neexistuje proměnná TERM), takže pokud se nějaký balíček pokusí zeptat na dodatečné informace (třeba otevře ncurses okno), tak proces zhavaruje a je nutno spustit na tomto stroji upgrade ručně. Bohužel jsem zatím nepřišel na to, jak se přes ssh připojit na stroj (login with shell) a poté zde spustit příkaz.
#!/bin/bash SERVERS=( server1.com server2.com etc.com ) keychain ~/.ssh/id_dsa -Q -q --lockwait 5 --attempts 5 --nolock; source ~/.keychain/*-sh; for SERVER in "${SERVERS[@]}"; do echo "Working on $SERVER"; # user-defined command? if [ -z "$1" ]; then ssh root@$SERVER 'apt-get -y update; apt-get -y upgrade'; else ssh root@$SERVER "$1"; fi done
Tiskni
Sdílej:
deb http://ftp.cz.debian.org/debian jessie main contrib non-free
$ echo 'apt-get upgrade' | /usr/bin/ssh root@stroj.xy.cz Pseudo-terminal will not be allocated because stdin is not a terminal. stdin: is not a tty Čtu seznamy balíků... Vytvářím strom závislostí... Následující balíky jsou podrženy v aktuální verzi: linux-image-server 0 aktualizováno, 0 nově instalováno, 0 k odstranění a 1 neaktualizováno. 1 instalováno nebo odstraněno pouze částečně. Potřebuji stáhnout 0B archivů. Po rozbalení bude na disku použito dalších 0B. Chcete pokračovat [Y/n]? Přerušeno.Zkrátka potřebuji do ssh spojení napsat automaticky apt-get upgrade (nebo něco jiného), ale aby byla zachována možnost do procesu zasáhnout (abych při nějakém problému mohl dát Yes/No). Tedy aby program ssh také přijímal vstup z klávesnice. Když navážu výstup echo na vstup ssh, tak to pak logicky nefunguje. Jak na to? Existuje nějaký filtr, který by přijal nějaké znaky a poté se zpět navázal na standardní vstup (z shellu)?
user@stroj:~$ ssh usertam@strojtam \ > 'export http_proxy="http://PROXYUSER:PROXYPASS@IPPROXY:PORT/" && \ > export ftp_proxy="http://PROXYUSER:PROXYPASS@IPPROXY:PORT/"; \ > sudo apt-get update; sudo apt-get upgrade'Pochopitelně pokud z nich nelezeš přes proxy tak tam nemusíš provést ten export. Chtěl jsem jen demonstrovat, že takhle můžeš naskládat libovolnou sekvenci příkazů.
apt-get update & upgrade if test $? != 0; then echo Error occured, please fix: bash fi(tento kod je pseudo)
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.