在lftp

时间:2018-08-10 08:40:29

标签: bash sftp lftp

我正在尝试使用SFTP将某些文件从一台服务器复制到另一台服务器,该任务应该每周运行一次。我使用的脚本:

    HOST='sftp://my.server.com'
    USER='user1'
    PASSWORD='passwd'
    DIR=$HOSTNAME

    REMOTE_DIR='/home/remote' 
    LOCAL_DIR='/home/local'     

    # LFTP via SFTP connexion
    lftp -u "$USER","$PASSWORD" $HOST <<EOF

    # changing directory
    cd "$REMOTE_DIR"

    $(if [ ! -d "$DIR" ]; then
     mkdir  $DIR

    fi)

    put -O "$REMOTE_DIR"/$DIR  "$LOCAL_DIR"/uploaded.txt

    EOF 

我的问题是执行 put 时没有考虑 if陈述的结果。

PS:我收到的错误消息如下:

  

输入:访问失败:没有这样的文件(/home/backups/myhost/upload.txt)

1 个答案:

答案 0 :(得分:1)

LFTP没有if语句!

您在这里做什么?

lftp -u "$USER","$PASSWORD" $HOST <<EOF
cd "$REMOTE_DIR"
$(if [ ! -d "$DIR" ]; then
 mkdir  $DIR
fi)
put -O "$REMOTE_DIR"/$DIR  "$LOCAL_DIR"/uploaded.txt
EOF 

您在here文档中调用子命令。在启动lftp之前,该子命令在本地执行,其输出被粘贴到here文档中,该文档将传递给lftp。这只是有效的,因为mkdir没有输出。您没有在ftp服务器上调用mkdir。您调用本地外壳程序的mkdir。实际上,这与将if语句放在lftp执行之前一样。

if [ ! -d "$DIR" ]; then
  mkdir $DIR
fi
lftp -u "$USER","$PASSWORD" $HOST <<EOF
cd "$REMOTE_DIR"
put -O "$REMOTE_DIR"/$DIR  "$LOCAL_DIR"/uploaded.txt
EOF 

您尝试执行的操作无效。您必须考虑其他解决方案。

现在,我没有FTP服务器可以对其进行测试,但是可以使用LFTP的-f的{​​{1}}选项。我假设它可以像Unix mkdir命令的-f选项一样工作。试试这个:

rm

更新:它按预期方式工作。如果使用选项lftp -u "$USER","$PASSWORD" $HOST <<EOF cd "$REMOTE_DIR" mkdir -f "$DIR" put -O "$REMOTE_DIR"/$DIR "$LOCAL_DIR"/uploaded.txt EOF ,创建目录已经存在,则不会出错:

-f

也许您的lftp anonymous@localhost:/pub> mkdir -f dir mkdir ok, `dir' created lftp anonymous@localhost:/pub> mkdir -f dir lftp anonymous@localhost:/pub> ls drwx------ 2 116 122 4096 Aug 10 12:04 dir 客户已过时。我用Debian 9进行了测试。