我使用以下脚本来循环浏览本地文件夹中的所有文件,并使用sftp
将其上传到sshpass
位置。我已经尝试了put
语句来上传单个文件。但我在某种程度上对我的<<EOF
和EOF
的正确位置有疑问?还是缺少其他东西?
#!/bin/bash
FILES= /MY_LOCAL_FOLDER_PATH/*
sshpass -p 'MY_PASSWORD' sftp -o StrictHostKeyChecking=no -o HostKeyAlgorithms=+ssh-dss MY_USERNAME@FTP_URL:/Import
<<EOF
for f in $FILES
do
chmod +X $f
put $f
done
EOF
我把chmod
放在那里,因为我的文件被“拒绝”。
答案 0 :(得分:2)
如果要为put
生成sftp
命令作为输入,则必须对其进行管道处理。您无法在here-document中处理循环。此外,您不应使用sshpass -p
,因为程序的命令行可通过proc
和ps
对系统中的所有进程显示,甚至是其他用户的命令行。 (非常简短,但无论如何都可见。)环境变量只对同一个用户可见,但通常情况下,ssh键可能仍然是可取的。
这样的事可能有用:
#!/bin/bash
export SSHPASS=MY_PASSWORD
for f in /path/* ; do
echo put "$f"
done | sshpass -e sftp user@whereever:/path
unset SSHPASS
循环内的所有命令都在本地执行,任何你想传递给sftp
的命令都应该通过echo
等打印。
(当然,命令不应该打印任何不应该转到sftp
的内容。)
答案 1 :(得分:-1)
尝试在<<EOF
sshpass
#!/bin/bash
FILES= /MY_LOCAL_FOLDER_PATH/*
sshpass -p 'MY_PASSWORD' sftp -o StrictHostKeyChecking=no \
-o HostKeyAlgorithms=+ssh-dss MY_USERNAME@FTP_URL:/Import <<EOF
for f in $FILES
do
chmod +X $f
put $f
done
EOF