使用 sshpass 循环时将 <<EOF 放在哪里?

Where to put <<EOF when looping using sshpass?

我正在使用以下脚本遍历本地文件夹中的所有文件,并使用 sshpass 将它们上传到 sftp 位置。我已经尝试过 put 语句来上传单个文件。但不知何故,我对正确放置 <<EOFEOF 的位置有疑问?还是缺少其他东西?

#!/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 放在那里是因为我的文件上有 "permission denied"。

尝试在 sshpass

之后的行尾使用 <<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

如果要为 sftp 生成 put 命令作为输入,则必须通过管道传输它们。您不能处理 here-document 中的循环。此外,您不应使用 sshpass -p,因为该程序的命令行通过 procps 对系统上的所有进程可见,甚至是其他用户的进程。 (非常简短,但无论如何都可见。)环境变量仅对同一用户可见,但一般来说,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 的东西。)