在哪里放&lt; <eof when =“”looping =“”using =“”sshpass?

时间:2017-06-14 07:53:37

标签: bash shell ssh sshpass

=“”

我使用以下脚本来循环浏览本地文件夹中的所有文件,并使用sftp将其上传到sshpass位置。我已经尝试了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放在那里,因为我的文件被“拒绝”。

2 个答案:

答案 0 :(得分:2)

如果要为put生成sftp命令作为输入,则必须对其进行管道处理。您无法在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的内容。)

答案 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