Live like you were going to die tomorrow; learn like you will live forever. — Gandhi
In: ALL
6 Dec 2008Bash има опция, която ако не се лъжа се нарича “пренасочване на входа”. Т.е. нещо подобно на това:
#!/bin/sh
mysql -u tsurko -p mydb <
SELECT * FROM test_table;
SELECT * FROM other_table;
quit
EOF
exit
Този скрипт ще се свърже с MySQL, ще поиска парола, ще изпълни 2-те заявки и ше излезе. По аналогичен начин обаче може да се направи и ssh сесия към сървър в bash скрипт. Ето един пример:
#!/bin/sh
ssh example.com <
touch test_file
exit
EOF
exit
Така от шел скрипта могат да се изпълнят произволни команди на сървъра. При стартирането на скрипта се появяват следните грешки:
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.
До колкото си спомням това е общоизвестен проблем, но не съм се задълбавал за да видя как се решава. Ако някой знае нещо по въпроса, ще се радвам да го сподели.
Това е полезно, но би било хубаво да се използват и шел променливи, за по-голяма гъвкавост. Всъщност това не е проблем. Ето например следния скрипт:
#!/bin/sh
TEST_VAR=sample_file
ssh example.com <
touch $TEST_VAR
exit
EOFecho "I'm back"
exit
В този случай променливата TEST_VAR се “взима” от environment-а, където се изпълнява скрипта (т.е. локалната машина) и като резултат на отдалечената машина се изпълнява командата “touch sample_file”.
Друг интересен въпрос е, какво може да се направи ако искаме да използваме шел променливите на машината, в която се логваме? Ето един пример:
#!/bin/sh
TEST_VAR=sample_file
ssh example.com <
touch \$TEST_VAR
exit
EOFecho "I'm back"
exit
Да приемем, че на сървъра имаме сетната променливата TEST_VAR. В този случай, понеже $ е escape-нат то “$TEST_VAR” се третира като обикновен стринг, а не като променлива. В резултат на това командата, която реално се изпълнява на отдалечената машина е “touch $TEST_VAR” и променливата $TEST_VAR се взима от environment-a на отдалечената машина, а не от тази на нашия скрипт.
И още нещо като за финал. Понякога се налага да се изпълнят едни и същи команди на няколко машини. В този случай трябва да ги въведем поотделно за всяка. Аз не успях да измисля как могат да се използват функции, за да се реши този проблем, затова прилагам следния метод. СЪздавам текстов файл с командите и използвам `cat
#!/bin/sh
ssh example.com <
`cat test.cmd`
exit
EOFssh example2.com <
`cat test.cmd`
exit
EOFexit
Също така файла трябва да съдържа само команди – така както биха се написали на отдалечената машина. Никакви, специфични за bash, неща няма да бъдат отработени.
Това е от мен – надявам се да съм бил полезен. Ще се радвам да чуя всякакви мнения и препоръки:)
1 Response to SSH сесии от BASH шел скрипт
Арсений
April 10th, 2010 at 2:50 am
Прив…
Хм..…