2017-06-14 288 views
0

我正在使用以下腳本來遍歷本地文件夾中的所有文件,並使用sshpass將它們上傳到sftp位置。我已經嘗試使用put語句上傳單個文件。但我不知何故在哪裏把我的<<EOFEOF正確?還是有其他缺失?在使用sshpass循環時,應該在哪裏放置<< EOF?

#!/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 

我把chmod那裏,因爲我的文件上有「拒絕權限」。

+0

我寧願推薦您使用批處理文件,而不是使用IO重定向進行harakiri。 – Jakuje

+0

@Jakuje這是所有'.sh'文件。如果您有任何問題,很高興看到您的解決方案。 – Disasterkid

回答

1

使用<<EOFаt行的末尾,你必須管他們。你不能在here-document中處理循環。此外,您不應該使用sshpass -p,因爲程序的命令行通過procps(即使是其他用戶的系統)對系統上的所有進程都可見。 (非常簡單,但仍然可見)。環境變量只對同一個用戶可見,但通常情況下,ssh鍵可能仍然是可取的。

像這樣的東西可能會奏效:

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

環路內的任何命令在本地執行,你想傳遞給sftp爲命令應通過echo或如打印任何東西。 (當然,這些命令不應該打印任何不應該打印到sftp的東西。)

+0

'export SSHPASS = xxx'做,我應該寫什麼「xxx」值? – Disasterkid

+1

@Disasterkid,'export var = value'爲指定的變量賦值,並將其標記爲導出,以便在腳本 – ilkkachu

+0

開始的命令環境中可見!非常感謝。 – Disasterkid

-1

嘗試,如果你想生成sftp作爲輸入put命令後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'需要反斜線轉義。 ('$ f' =>'\ $ f') – pynexj

+0

'sftp'不支持'for'命令,所以你只會得到一些'Invalid command.'錯誤 – ilkkachu

相關問題