Chciałbym wykonać kilka poleceń w sekwencji na komputerze zdalnym, a niektóre z późniejszych poleceń zależą od wcześniejszych. W możliwie najprostszy przykład uzyskać to:czy można używać zmiennych w zdalnych komendach ssh?
ssh my_server "echo this is my_server; abc=2;"
this is my_server
abc=2: Command not found.
ssh my_server "echo this is my_server; abc=2; echo abc is $abc"
abc: undefined variable
Dla nieco informacji tła, co tak naprawdę chcę robić to kawałek razem ścieżką i uruchomić aplikację Java:
ssh my_server 'nohup sh -c "((echo this is my_server; jabref_exe=`which jabref`; jabref_dir=`dirname $jabref_exe`; java -jar $jabref_dir/../jabref.jar` $1 &/dev/null) &)"' &
jabref_dir: Undefined variable.
ten sposób, za każdym razem, gdy jabref zostanie zaktualizowany do nowej wersji na serwerze, nie będę musiał ręcznie aktualizować ścieżki do pliku JAR. Plik wykonywalny jabref nie przyjmuje argumentów, ale uruchamia go z java -jar
, dlatego muszę nieco żonglować ścieżką.
Obecnie mam listę poleceń w osobnym pliku skryptu i wywołać
ssh my_server 'nohup sh -c "((my_script.sh &/dev/null) &)"' &
który działa, ale ponieważ połączenie ssh jest już wewnątrz jednego pliku skryptu byłoby miło mieć wszystko razem.
dzięki, że postawiłem na dobrej drodze. Zapobieganie ekspansji za pomocą przecinków lub '\ $' było kluczowe. Okazuje się, że domyślną powłoką na serwerze było tcsh, i to był kolejny powód, dla którego 'abc = 2' nie działało. – craq
Świetna odpowiedź. Używam Jenkinsa z wtyczką SSH Agent i działa jak urok. –