2017-06-14 12 views
0

Ich verwende das folgende Skript, um alle Dateien in einem lokalen Ordner zu durchlaufen und sie unter Verwendung von sshpass an einen Speicherort sftp hochzuladen. Ich habe bereits die put Anweisung versucht, um eine einzelne Datei hochzuladen. Aber ich habe irgendwie Probleme, wo ich meine <<EOF und EOF richtig setzen? Oder fehlt noch etwas?Wo << EOF wenn Schleife mit sshpass setzen?

#!/bin/bash 

FILES= /MY_LOCAL_FOLDER_PATH/* 
sshpass -p 'MY_PASSWORD' sftp -o StrictHostKeyChecking=no -o HostKeyAlgorithms=+ssh-dss [email protected]_URL:/Import 
<<EOF 
for f in $FILES 
do 
chmod +X $f 
put $f 
done 
EOF 

Ich legte den chmod dort, weil ich bekam „Zugriff verweigert“ auf meine Dateien. sie

+0

Ich würde eher empfehlen, Sie verwenden eine Batch-Datei als Harakiri mit IO-Umleitung zu tun. – Jakuje

+0

@Jakuje Dies ist alles in einer '.sh' Datei. Wäre froh, Ihre Lösung zu sehen, wenn Sie welche haben. – Disasterkid

Antwort

1

verwenden Wenn Sie die put Befehle für sftp als Eingabe erzeugen möchten, müssen Sie mit dem Rohr haben. Sie können Schleifen in einem Here-Dokument nicht verarbeiten. Außerdem sollten Sie sshpass -p nicht verwenden, da die Befehlszeile des Programms für alle Prozesse im System über proc und ps sichtbar ist, auch die anderer Benutzer. (Sehr kurz, aber trotzdem sichtbar.) Umgebungsvariablen sind nur für den gleichen Benutzer sichtbar, obwohl ssh-Schlüssel im Allgemeinen immer noch vorzuziehen sind.

So etwas wie dies funktionieren könnte:

#!/bin/bash 
export SSHPASS=MY_PASSWORD 
for f in /path/* ; do 
    echo put "$f" 
done | sshpass -e sftp [email protected]:/path 
unset SSHPASS 

Alle Befehle innerhalb der Schleife lokal ausgeführt werden, alles, was Sie sftp übergeben möchten, wie Befehle über echo oder so gedruckt werden soll. (Natürlich sollten die Befehle nichts drucken, das nicht zu sftp gehen soll.)

+0

Was bedeutet die Zeile' export SSHPASS = xxx' do und was soll ich für die "xxx" Werte schreiben? – Disasterkid

+1

@Disasterkid, 'export var = value' weist der benannten Variablen einen Wert zu und markiert ihn exportiert, so dass er in der Umgebung der vom Skript gestarteten Befehle sichtbar ist – ilkkachu

+0

funktioniert! ich danke dir sehr. – Disasterkid

-1

Versuchen <<EOF аt Ende der Zeile nach sshpass

#!/bin/bash 

FILES= /MY_LOCAL_FOLDER_PATH/* 
sshpass -p 'MY_PASSWORD' sftp -o StrictHostKeyChecking=no \ 
    -o HostKeyAlgorithms=+ssh-dss [email protected]_URL:/Import <<EOF 
for f in $FILES 
do 
chmod +X $f 
put $f 
done 
EOF 
+0

'$ f' muss Backslash-Escape sein. ('$ f' =>' \ $ f') – pynexj

+0

'sftp' unterstützt keinen' for' Befehl, daher erhalten Sie nur eine Anzahl von 'Ungültige Befehle.' Fehler – ilkkachu