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.
Odpowiedzi:
Byłeś bardzo blisko ze swoim przykładem. Działa dobrze, gdy używasz go z argumentami takimi jak te.
Przykładowy skrypt:
Przykład, który działa:
Ale zawodzi w przypadku tego rodzaju argumentów:
Co się dzieje?
Problem, który napotykasz, polega na tym, że argument
-time
lub--time
w moim przykładzie jest interpretowany jako przejście nabash -s
. Możesz go uspokoićbash
, przerywając pobieranie jednego z pozostałych argumentów wiersza poleceń za pomocą tego--
argumentu.Lubię to:
Przykłady
# 1:
# 2:
# 3:
# 4:
UWAGA: Aby wyjaśnić, że gdziekolwiek pojawia się przekierowanie w wierszu poleceń, nie ma znaczenia, ponieważ i tak
ssh
wywoł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:źródło
bash -s -- --time bye < ./ex.bash
lub 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.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
bash
lubksh
jako/bin/sh
Jeśli twój pilot
/bin/sh
jest 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: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 %q
bash, gdy znaki ucieczki występują w łańcuchu znaków), nawet jeśli jest/bin/sh
to bazowy POSIX (taki jakdash
lubash
), to robi się bardziej interesujący:Użycie (w jednym z powyższych)
Funkcje podane powyżej można następnie wywołać jako:
...lub...
źródło
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
źródło