使用 sshpass 循环时将 <<EOF 放在哪里?
Where to put <<EOF when looping using sshpass?
我正在使用以下脚本遍历本地文件夹中的所有文件,并使用 sshpass
将它们上传到 sftp
位置。我已经尝试过 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
放在那里是因为我的文件上有 "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
,因为该程序的命令行通过 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
的东西。)
我正在使用以下脚本遍历本地文件夹中的所有文件,并使用 sshpass
将它们上传到 sftp
位置。我已经尝试过 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
放在那里是因为我的文件上有 "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
,因为该程序的命令行通过 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
的东西。)