Ich habe ein Skript geschrieben, das bei lokaler Ausführung einwandfrei funktioniert:
./sysMole -time Aug 18 18
Die Argumente "-time" , "Aug" , "18" und "18" werden erfolgreich an das Skript übergeben.
Dieses Skript kann jetzt auf einem Remotecomputer ausgeführt werden, jedoch in einem lokalen Verzeichnis auf dem lokalen Computer. Beispiel:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole
Das funktioniert auch gut. Das Problem tritt jedoch auf, wenn ich versuche, die oben genannten Argumente einzubeziehen (-time Aug 18 18) , zum Beispiel:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18
Nach dem Ausführen dieses Skripts erhalte ich die folgende Fehlermeldung:
bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell
Bitte sag mir, was ich falsch mache, das ist sehr frustrierend.
Antworten:
Sie waren Ihrem Beispiel ziemlich nahe. Es funktioniert einwandfrei, wenn Sie es mit Argumenten wie diesen verwenden.
Beispielskript:
Beispiel, das funktioniert:
Bei folgenden Argumenten schlägt dies jedoch fehl:
Was ist los?
Das Problem, auf das Sie stoßen, besteht darin, dass das Argument
-time
oder--time
in meinem Beispiel als Wechsel zu interpretiert wirdbash -s
. Sie können beruhigen,bash
indem Sie beenden, indem Sie eines der verbleibenden Befehlszeilenargumente mit dem Argument für sich selbst übernehmen--
.So was:
Beispiele
# 1:
# 2:
#3:
# 4:
ANMERKUNG: Nur um zu verdeutlichen, dass die Umleitung in der Befehlszeile keinen Unterschied macht, da das
ssh
Aufrufen einer Remote-Shell mit der Verkettung ihrer Argumente ohnehin keinen großen Unterschied macht, es sei denn, Sie müssen in der Remote-Shell zitieren wie in Beispiel # 4:quelle
bash -s -- --time bye < ./ex.bash
oder sogar< ./ex.bash bash -s -- --time bye
. Dies liegt daran, dass die Shell zuerst die Umleitungsanweisung ausführt (unabhängig davon, wo sie sich im Befehl befindet), dann die Umleitung einrichtet und dann den Rest der Befehlszeile mit der Umleitung ausführt.Zum Umgang mit willkürlichen Argumenten
Wenn Sie wirklich nur eine einzige Zeichenfolge verwenden, z.
-time Aug 18 18
Dann können Sie es einfach hart codieren, und vorhandene Antworten zeigen Ihnen, wie Sie dies angemessen tun können. Wenn Sie dagegen unbekannte Argumente weitergeben müssen (z. B. eine Nachricht, die auf dem anderen System angezeigt werden soll, oder den Namen einer Datei, die erstellt wurde, um den Namen des Endbenutzers zu steuern), ist mehr Sorgfalt erforderlich.Mit
bash
oderksh
als/bin/sh
Wenn Ihre Fernbedienung
/bin/sh
von bash oder ksh bereitgestellt wird, können Sie mit einer nicht vertrauenswürdigen Argumentliste sicher Folgendes tun, sodass auch böswillige Namen (wie$(rm -rf $HOME).txt
) sicher als Argumente übergeben werden können:Mit allen POSIX-konformen
/bin/sh
Um sicher zu gehen, dass keine hinreichend böswilligen Argumentdaten (z. B. oder ) verwendet werden, die nicht POSIX-konform
printf %q
sind, wenn in der zu maskierenden Zeichenfolge nicht druckbare Zeichen enthalten sind ) wird ein bisschen interessanter:/bin/sh
dash
ash
Verwendung (für eine der oben genannten Möglichkeiten)
Die oben angegebenen Funktionen können dann wie folgt aufgerufen werden:
...oder...
quelle
say aa ist eine lokale Datei, die ls enthält
$ssh servername "cat | bash" < a.a
ändere 127.0.0.1 auf deine entfernte IP
Diese beiden geben eine Nachricht über die Pseudotty-Zuweisung, funktionieren aber.
$ cat a.a | ssh 127.0.0.1
$ ssh 127.0.0.1 <a.a
Oder
$ cat a.a | ssh 127.0.0.1 bash or
$ ssh 127.0.0.1 bash < a.a
quelle