在 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 测试了它。
我正在尝试使用 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 测试了它。