在 lftp 中添加 shell if 语句

Adding shell if statement inside 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 statment 的结果。

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

put: Access failed: No such file (/home/backups/myhost/upload.txt)

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 

您在此处的文档中调用了子命令。子命令在 lftp 启动之前在本地执行,其输出粘贴在此处的文档中,该文档被传递给 lftp。这只是工作,因为 mkdir 没有输出。您不会在 ftp 服务器上调用 mkdir。你调用本地 shell 的 mkdir。实际上,它与在 lftp 执行之前放置 if 语句相同。

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 的 mkdir-f 选项。我假设它可能像 Unix rm 命令的 -f 选项一样工作。试试这个:

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

也许您 lftp 客户端已经过时了。我用 Debian 9 测试了它。