Jak mogę wykonać skrypt lokalny na zdalnym komputerze i dołączyć argumenty?


116

Napisałem skrypt, który działa poprawnie, gdy jest wykonywany lokalnie:

./sysMole -time Aug 18 18

Argumenty „-time” , „Aug” , „18” i „18” są pomyślnie przekazywane do skryptu.

Teraz ten skrypt został zaprojektowany do działania na komputerze zdalnym, ale z lokalnego katalogu na komputerze lokalnym. Przykład:

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole

To też działa dobrze. Problem pojawia się jednak, gdy próbuję uwzględnić wyżej wymienione argumenty (-czas 18 sierpnia 18) , na przykład:

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18

Po uruchomieniu tego skryptu pojawia się następujący błąd:

bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell

Powiedz mi, co robię źle, to bardzo frustrujące.


1
„Bash -s” jest jednym ze sposobów na wykonanie skryptu ze standardowego wejścia (np. Pliku).
AllenD,

Odpowiedzi:


160

Byłeś bardzo blisko ze swoim przykładem. Działa dobrze, gdy używasz go z argumentami takimi jak te.

Przykładowy skrypt:

$ more ex.bash 
#!/bin/bash

echo $1 $2

Przykład, który działa:

$ ssh serverA "bash -s" < ./ex.bash "hi" "bye"
hi bye

Ale zawodzi w przypadku tego rodzaju argumentów:

$ ssh serverA "bash -s" < ./ex.bash "--time" "bye"
bash: --: invalid option
...

Co się dzieje?

Problem, który napotykasz, polega na tym, że argument -timelub --timew moim przykładzie jest interpretowany jako przejście na bash -s. Możesz go uspokoić bash, przerywając pobieranie jednego z pozostałych argumentów wiersza poleceń za pomocą tego --argumentu.

Lubię to:

$ ssh root@remoteServer "bash -s" -- < /var/www/html/ops1/sysMole -time Aug 18 18

Przykłady

# 1:

$ ssh serverA "bash -s" -- < ./ex.bash "-time" "bye"
-time bye

# 2:

$ ssh serverA "bash -s" -- < ./ex.bash "--time" "bye"
--time bye

# 3:

$ ssh serverA "bash -s" -- < ./ex.bash --time "bye"
--time bye

# 4:

$ ssh  < ./ex.bash serverA "bash -s -- --time bye"
--time bye

UWAGA: Aby wyjaśnić, że gdziekolwiek pojawia się przekierowanie w wierszu poleceń, nie ma znaczenia, ponieważ i tak sshwywołuje zdalną powłokę z konkatenacją jej argumentów, cytowanie nie robi dużej różnicy, z wyjątkiem sytuacji, gdy potrzebujesz cytowania w zdalnej powłoce jak w przykładzie 4:

$ ssh  < ./ex.bash serverA "bash -s -- '<--time bye>' '<end>'"
<--time bye> <end>

4
jesteś geniuszem! Co muszę zrobić, aby dostać się do twojego poziomu? Mam dużo pracy wyciętej. Dzięki wielkie.
AllenD,

14
@AllenD - po prostu zadawaj pytania i staraj się uczestniczyć w witrynie w jak największym stopniu. Zawsze staram się każdego dnia uczyć czegoś nowego. Przed twoim pytaniem też nie wiedziałem, jak to zrobić. 8-). Dziękuję za twoje pytanie!
slm

5
zwróć uwagę, że przekierowanie może pojawić się w dowolnym punkcie polecenia: na przykład bash -s -- --time bye < ./ex.bashlub nawet < ./ex.bash bash -s -- --time bye. dzieje się tak, ponieważ powłoka najpierw pobiera instrukcję przekierowania (niezależnie od tego, gdzie jest w poleceniu), a następnie konfiguruje przekierowanie, a następnie wykonuje resztę wiersza poleceń z przekierowaniem na miejscu.
lesmana,

@sim Próbuję zrobić dokładnie to samo, ale ze skryptu, a nie z wiersza poleceń. Wiesz, jak to zrobić? Z jakiegoś powodu umieszczenie dokładnej odpowiedzi w backticksie w ogóle nie działa. Zamiast tego uruchamia skrypt określony lokalnie, a dane wyjściowe są wysyłane jako polecenie do bash przez ssh
krb686

@ krb686 - Chciałbym zapytać o to jako nowy Q.
slm

5

O postępowaniu z arbitralnymi argumentami

Jeśli naprawdę używasz tylko jednego ciągu, tj. -time Aug 18 18, możesz go po prostu zakodować na stałe, a istniejące odpowiedzi podpowiedzą, jak zrobić to odpowiednio. Z drugiej strony, jeśli musisz przekazać nieznane argumenty (np. Komunikat wyświetlany w innym systemie lub nazwę pliku utworzonego, w którym użytkownicy końcowi mogliby kontrolować jego nazwę), konieczna jest większa ostrożność.


Z bashlub kshjako/bin/sh

Jeśli twój pilot /bin/shjest dostarczany przez bash lub ksh, możesz bezpiecznie wykonać następujące czynności z niezaufaną listą argumentów, tak że nawet złośliwe nazwy (jak $(rm -rf $HOME).txt) mogą być bezpiecznie przekazywane jako argumenty:

runRemote() {
  local args script

  script=$1; shift

  # generate eval-safe quoted version of current argument list
  printf -v args '%q ' "$@"

  # pass that through on the command line to bash -s
  # note that $args is parsed remotely by /bin/sh, not by bash!
  ssh user@remote-addr "bash -s -- $args" < "$script"
}

Z każdą zgodną z POSIX /bin/sh

Aby zabezpieczyć się przed wystarczająco złośliwymi danymi argumentów (próba skorzystania z cudzysłowu niezgodnego z POSIX, używanego przez printf %qbash, gdy znaki ucieczki występują w łańcuchu znaków), nawet jeśli jest /bin/shto bazowy POSIX (taki jak dashlub ash), to robi się bardziej interesujący:

runRemote() {
  local script=$1; shift
  local args
  printf -v args '%q ' "$@"
  ssh user@remote-addr "bash -s" <<EOF

  # pass quoted arguments through for parsing by remote bash
  set -- $args

  # substitute literal script text into heredoc
  $(< "$script")

EOF
}

Użycie (w jednym z powyższych)

Funkcje podane powyżej można następnie wywołać jako:

# if your time should be three arguments
runRemote /var/www/html/ops1/sysMole -time Aug 18 18

...lub...

# if your time should be one string
runRemote /var/www/html/ops1/sysMole -time "Aug 18 18"

-3

powiedzmy, że aa to lokalny plik zawierający ls

$ssh servername "cat | bash" < a.a

zmień 127.0.0.1 na dowolny zdalny adres IP

te dwa dają komunikat o alokacji pseudo-tty, ale działają.

$ cat a.a | ssh 127.0.0.1

$ ssh 127.0.0.1 <a.a

Lub

$ cat a.a | ssh 127.0.0.1 bash or

$ ssh 127.0.0.1 bash < a.a


2
Próbuję zobaczyć, jak daleko to odpowiada na pytanie.
ChrisWue,

Jakość i formatowanie jest wątpliwe. Nie widzę też żadnych nowych przydatnych informacji, których nie ma w zaakceptowanej odpowiedzi.
Julie Pelletier

@JuliePelletier Podałem kilka przykładów „kotów”, których nie ma w zaakceptowanej odpowiedzi. Dobrze jest znać alternatywne sposoby robienia rzeczy.
barlop

To nie jest dobra rzecz; twoje koty są bezużyteczne.
Scott

2
O mój Boże. Pominąłem link do Bezużyteczne użycie kota, ponieważ zakładałem, że wszyscy już słyszeli o tym zdaniu; najwyraźniej było to złe założenie z mojej strony.
Scott
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.