Portál AbcLinuxu, 11. května 2025 21:04

Dotaz: príliš skorá expanzia príkazu

jose17 avatar 22.3.2007 13:06 jose17 | skóre: 44 | blog: Joseho_blog | Bratislava
príliš skorá expanzia príkazu
Přečteno: 141×
Odpovědět | Admin
prosím, potrebujem pomôcť s nasledovným kódom:
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
Ja vim, on vi, ty nano!
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.3.2007 14:20 Ondřej Kubečka | skóre: 29 | blog: datlovo | Ulm
Rozbalit Rozbalit vše Re: príliš skorá expanzia príkazu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejsem si jistý, zda to souvisí, ale rozhodně Vám tam chybí jedny uvozovky úplně na konci parametru příkazu echo.

...tedy pokud jsem dobře koukal. ;)
http://prirucka.ujc.cas.cz/?ref=785&id=790.
jose17 avatar 22.3.2007 14:28 jose17 | skóre: 44 | blog: Joseho_blog | Bratislava
Rozbalit Rozbalit vše Re: príliš skorá expanzia príkazu
jo, máte recht. ale ich pridanie nepomôže.
Ja vim, on vi, ty nano!
22.3.2007 14:54 JMP | skóre: 30
Rozbalit Rozbalit vše Re: príliš skorá expanzia príkazu
a mozna by to chtelo dalsi tak, aby to vzalo druhy ssh i s parametrama jako jeden prikaz?
22.3.2007 15:18 Ondřej Kubečka | skóre: 29 | blog: datlovo | Ulm
Rozbalit Rozbalit vše Re: príliš skorá expanzia príkazu
Tak jsem na to ještě koukal a uteklo mi, že tam máte jeden krok mezi. Vypadá to, že věc se má takhle:

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.
Medved09 avatar 22.3.2007 15:24 Medved09 | skóre: 26 | Havlíčkův Brod / Brno
Rozbalit Rozbalit vše Re: príliš skorá expanzia príkazu
Odpovědět | | Sbalit | Link | Blokovat | Admin

jen tak z hlavy - zkousel jste

... \\"$(ntpq -p | sed -n 3p ...
Fordem tam, vlakem zpátky :-)
23.3.2007 09:35 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: príliš skorá expanzia príkazu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Myslím, že bude výrazně přehlednější, když na cílový stroj nakopíruješ skript, který se má spustit. Kdyby se navíc dalo zbavit toho "StrictHostKeyChecking=no", mohlo by se psát jen
ssh host02 ssh host01 skript
A 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".

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.