Wie erstelle ich ein Verzeichnis auf dem Remote-Host, wenn es nicht ohne SSH-ing existiert?
Frage
Ich bin mir nicht sicher, ob dies möglich ist oder nicht. Grundsätzlich schreibe ich ein Skript, das es mir ermöglicht SCP Eine Datei zu meinem Hosting. Das ist es so weit. Argument 1 ist die Datei und das Argument 2 ist der Ordner, den ich auf dem Remote -Server platzieren soll:
function upload {
scp $1 myusername@ssh.myhost.net:$2
}
Wie Sie vielleicht wissen/nicht wissen, wenn das Verzeichnis, das ich angibt, wenn ich die Funktion aufrufe, nicht vorhanden ist, schlägt die Übertragung fehl. Gibt es eine Möglichkeit zu überprüfen, ob das Verzeichnis in der Funktion vorhanden ist und ob dies nicht der Fall ist, erstellen Sie es.
Ich würde es vorziehen, nicht jedes Mal SSH zu haben und das Verzeichnis zu erstellen, aber wenn ich keine Wahl habe, habe ich keine Wahl.
Lösung
Sie können RSYNC verwenden.
Zum Beispiel,
rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO
Hinweis zu RSYNC:
RSYNC ist Utility -Software und Netzwerkprotokoll für UNIX, das Dateien und Verzeichnisse von einem Speicherort zu einem anderen synchronisiert und gleichzeitig die Datenübertragung minimiert, indem sie bei Bedarf mit dem RSYNC -Algorithmus, der schneller als andere Tools ist, verwendet wird.
Andere Tipps
Ich nehme an, Sie meinen, Sie möchten sich nicht interaktiv anmelden und Verzeichnisse von Hand erstellen, anstatt dass Sie es vermeiden möchten ssh
Insgesamt, da Sie noch ein Passwort oder einen öffentlichen Schlüssel mit benötigen scp
.
Wenn die Verwendung von SSH nicht interaktiv akzeptabel verwendet wird, können Sie Ihre Datei mithilfe der Datei streamen cat
Über ssh
:
cat $1 | ssh $2 "mkdir $3;cat >> $3/$1"
wo
$1 = filename
$2 = user@server
$3 = dir_on_server
Wenn das Verzeichnis bereits existiert, mkdir
beschwert sich, aber die Datei wird immer noch kopiert. Das bestehende Verzeichnis wird nicht überschrieben. Wenn das Verzeichnis nicht existiert, mkdir
wird es erstellen.
Wenn Sie einen rekursiven SCP (-R) durchführen, kopiert es auch Verzeichnisse. Wenn Sie also ein Verzeichnis des Namens erstellen, den Sie auf dem Remote -Host lokal gewünscht haben, kopieren Sie die Datei in sie und kopieren Sie dann rekursiv, das Verzeichnis wird mit der Datei erstellt.
Irgendwie unangenehm, aber es würde den Job machen.
Dies ist ein zweistufiger Prozess
ssh myusername@ssh.myhost.net "mkdir -p $2"
Dies stellt sicher, dass die Verzeichnisstruktur erstellt wird. Dann kopieren Sie
scp $1 myusername@ssh.myhost.net:$2
Wie wäre es zum Beispiel, zum Beispiel,
ssh remote_user@remote.host '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt remote_user@remote.host:/tmp/nonexist/dir
sshfs
sei modisch!
Beispiel .ssh/config
Host your-host
HostHame example.com
User name
IdentitiesOnly yes
IdentityFile ~/.ssh/private_key
Lokale Setup abgesehen von oben erfordert nur a Ziel Einhängepunkt...
sudo mkdir /media/your-host
sudo chown ${USER}:${USER} /media/your-host
... danach sind Dinge wie Montage und Unmontage weitaus einfacher zu Skript.
Montieren
sshfs your-host:within-home/some-dir /media/your-host
Unmontal
fusermount -u /media/your-host
Das Beste an diesem Ansatz, wenn ein Server dies zulässt, ist, dass lokal ausgeführte Skripte mit dem Remotedateisystem interagieren können. Das heißt, dass Dinge wie ...
if ! [ -d "/media/your-host/nowhere" ]; then
mkdir -vp "/media/your-host/nowhere"
fi
... werden unter vielen anderen Tricks möglich, die über solche Montagemagien vorgebaut werden können.