我正在尝试使用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)
答案 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进行了测试。