我正在尝试使用 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(
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
在此处文档中调用 sub 命令。sub 命令在启动之前在本地执行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
选项mkdir
。我假设它可能像 Unixrm
命令的-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 测试了它。