Portál AbcLinuxu, 8. listopadu 2025 09:28
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' %status
Není 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.