Portál AbcLinuxu, 11. května 2025 21:04
ssh -o StrictHostKeyChecking=no host02 ssh -o StrictHostKeyChecking=no host01 'echo "`if [ $(ps -ef | grep xntpd | wc -l) -ne 0 -a \"$(ntpq -p | sed -n 3p | sed \"s/[^ ]* *[^ ]* *\([^ ]*\) *.*/\1/\")\" != 1 ]; then echo \"yes\"; else echo \"no\"; fi`;'čiže sa jedná o spustenie kódu na vzdialenom stroji (host01), na ktorý sa pripájam z iného vzdialeneho stroja (host02). problém je v tom, že ntpq sa spustí lokálne. nejak si s tým už neviem dať rady. díky za pomoc, -- jose
echo
.
...tedy pokud jsem dobře koukal. ;)
ssh host01 ssh host02 echo $HOSTNAME
expanduje $HOSTNAME rovnou na mašině, kde to spouštíte, to je celkem ještě jasné.
ssh host01 ssh host02 'echo $HOSTNAME'
By člověk možná čekal, že se nic neexpanduje a ssh spojení na host02 dostane 'echo $HOSTNAME'
jako svůj parametr... jenomže host jedna prostě spustí:
ssh host02 echo $HOSTNAME
Jsme tedy o krok blíže, ale ještě ne tam, kde jsme chtěli.
Tak to escapujeme i pro interpretaci na host02 a voila:
ssh host01 ssh host02 'echo \$HOSTNAME'
máme hostname z host02. Drobný detail, pro $(...)
budete muset escapovat vše, tedy: \$\(...\)
, ale to byste brzy jistě zjistil sám, ono už by si to postěžovalo.
jen tak z hlavy - zkousel jste
... \\"$(ntpq -p | sed -n 3p ...
ssh host02 ssh host01 skriptA co se týče toho skriptu, napsal bych ho takhle:
#!/usr/bin/env python from subprocess import * command = ['/usr/sbin/ntpq', '-p'] process = Popen(command, stdout = PIPE, stderr = STDOUT) #precti vsechny radky for line in process.stdout: pass #na konci cyklu bude v promenne line posledni radek if 'Connection refused' in line: #demon asi neni spusten raise SystemExit, 'ntpd is not running' #posledni radek rozsekej po mezerach splitted = line.split() #vyber treti polozku a preved ji na cislo status = int(splitted[2]) #vypis status print 'status is %d' %statusNení nutné předem testovat, zda démon běží. Dá se rovnou pustit "ntpq -p" a odchytávat hlášku "Connection refused".
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.