Die Warnmeldung Pseudo-terminal will not be allocated because stdin is not a terminal.
ist auf die Tatsache zurückzuführen, dass kein Befehl für ssh
während stdin von einem Dokument hierher umgeleitet wird. In Ermangelung eines angegebenen Befehls als Argument ssh
erwartet zunächst eine interaktive Anmeldesitzung (was die Zuweisung eines pty auf dem entfernten Rechner erfordern würde), muss dann aber feststellen, dass seine lokale stdin kein tty/pty ist. Umleitung von ssh
stdin aus einem Dokument hier zu lesen, erfordert normalerweise einen Befehl (wie /bin/sh
), die als Argument für ssh
- und in einem solchen Fall wird auf dem entfernten Rechner standardmäßig kein pty zugewiesen.
Da es keine Befehle gibt, die über ssh
die das Vorhandensein eines tty/pty erfordern (wie z.B. vim
o top
) die -t
umschalten ssh
ist überflüssig. Verwenden Sie einfach ssh -T user@server <<EOT ...
o ssh user@server /bin/bash <<EOT ...
und die Warnung wird verschwinden.
Si <<EOF
nicht escaped oder in Anführungszeichen gesetzt ist (d. h. <<\EOT
o <<'EOT'
) werden die Variablen in diesem Dokument von der lokalen Shell expandiert, bevor sie ausgeführt werden ssh ...
. Dies hat zur Folge, dass die Variablen in diesem Dokument leer bleiben, da sie nur in der entfernten Shell definiert sind.
Also, wenn $REL_DIR
sollte sowohl von der lokalen Shell zugänglich als auch in der entfernten Shell definiert sein, $REL_DIR
muss außerhalb des vorliegenden Dokuments definiert werden, bevor die ssh
Befehl ( Version 1 unten); oder, wenn <<\EOT
o <<'EOT'
verwendet wird, wird die Ausgabe der ssh
Befehl kann zugewiesen werden REL_DIR
wenn die einzige Ausgabe des ssh
Befehl auf stdout wird generiert durch echo "$REL_DIR"
innerhalb des escaped/single-quoted here Dokuments ( Version 2 unten).
Eine dritte Möglichkeit wäre, das Dokument hier in einer Variablen zu speichern und diese Variable dann als Befehlsargument an ssh -t user@server "$heredoc"
( Version 3 unten).
Und zu guter Letzt wäre es keine schlechte Idee, zu überprüfen, ob die Verzeichnisse auf dem entfernten Rechner erfolgreich erstellt wurden (siehe: prüfen, ob die Datei auf dem entfernten Rechner mit ssh existiert ).
# version 1
unset DEP_ROOT REL_DIR
DEP_ROOT='/tmp'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR="${DEP_ROOT}/${datestamp}"
ssh localhost /bin/bash <<EOF
if [ ! -d "$DEP_ROOT" ] && [ ! -e "$DEP_ROOT" ]; then
echo "creating the root directory" 1>&2
mkdir "$DEP_ROOT"
fi
mkdir "$REL_DIR"
#echo "$REL_DIR"
exit
EOF
scp -r ./dir1 user@server:"$REL_DIR"
scp -r ./dir2 user@server:"$REL_DIR"
# version 2
REL_DIR="$(
ssh localhost /bin/bash <<\EOF
DEP_ROOT='/tmp'
datestamp=$(date +%Y%m%d%H%M%S)
REL_DIR="${DEP_ROOT}/${datestamp}"
if [ ! -d "$DEP_ROOT" ] && [ ! -e "$DEP_ROOT" ]; then
echo "creating the root directory" 1>&2
mkdir "$DEP_ROOT"
fi
mkdir "$REL_DIR"
echo "$REL_DIR"
exit
EOF
)"
scp -r ./dir1 user@server:"$REL_DIR"
scp -r ./dir2 user@server:"$REL_DIR"
# version 3
heredoc="$(cat <<'EOF'
# -onlcr: prevent the terminal from converting bare line feeds to carriage return/line feed pairs
stty -echo -onlcr
DEP_ROOT='/tmp'
datestamp="$(date +%Y%m%d%H%M%S)"
REL_DIR="${DEP_ROOT}/${datestamp}"
if [ ! -d "$DEP_ROOT" ] && [ ! -e "$DEP_ROOT" ]; then
echo "creating the root directory" 1>&2
mkdir "$DEP_ROOT"
fi
mkdir "$REL_DIR"
echo "$REL_DIR"
stty echo onlcr
exit
EOF
)"
REL_DIR="$(ssh -t localhost "$heredoc")"
scp -r ./dir1 user@server:"$REL_DIR"
scp -r ./dir2 user@server:"$REL_DIR"