【问题标题】:FTP Shell Script mkdir issueFTP Shell 脚本 mkdir 问题
【发布时间】:2012-07-19 03:17:07
【问题描述】:

我正在使用 Bash FTP 命令来 ftp 文件,但是我有一个问题,我尝试创建一个超过 2 个文件夹深的目录。如果我使用两个深度文件夹,它可以工作,但如果我深入三个文件夹,那么它会失败。例如:

mkdir foo/bar - this works
mkdir foo/bar/baz - this fails

我也试过这个:

mkdir -p foo/bar/baz - which didn't work, it ended up creating a '-p' directory

我尝试运行的 shell 脚本实际上非常简单,但是您可以看到目录结构有 3 个文件夹深,并且无法创建所需的文件夹:

#!/bin/bash
DIRECTORY="foo/bar/baz"
FILE="test.pdf"         
HOST="testserver"           
USER="test"         
PASS="test"         

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASS
mkdir $DIRECTORY
cd $DIRECTORY
binary
put $FILE
quit
END_SCRIPT

【问题讨论】:

  • Bash 没有 ftp 命令 - ftp 是一个外部实用程序,它非常不安全。使用其他内容,例如 sftp
  • 您是否有示例说明如何使用 sftp 代替 ftp?我还能用同样的方式指定用户名和密码吗?
  • 不,您应该使用密钥文件。顺便说一句,sftp 也是一个外部实用程序。见man sftp
  • 你确定我可以用这个sftp 指定深度超过 3 个文件夹的目录吗?

标签: bash ftp


【解决方案1】:

ftp下的mkdir是由ftp服务器实现的,不是通过调用/bin/mkdir来实现的,没有-p之类的选项, 你应该做的是

mkdir foo
cd foo
mkdir bar
cd bar
mkdir baz
cd baz

如果你仍然想要原来的构造,你也可以这样做:

#!/bin/bash
foo() {
    local r
    local a
    r="$@"
    while [[ "$r" != "$a" ]] ; do
        a=${r%%/*}
        echo "mkdir $a"
        echo "cd $a"
        r=${r#*/}
    done
}
DIRECTORY="foo/bar/baz"
FILE="test.pdf"         
HOST="testserver"           
USER="test"         
PASS="test"         

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASS
$(foo "$DIRECTORY")
binary
put $FILE
quit
END_SCRIPT

【讨论】:

  • 是的,我知道这会起作用,但是当我将目录段作为参数传递时,这使得这种方法非常不切实际,尤其是当我有不同长度的文件路径时。
  • 披萨是对的。 99% 的 Ftp 客户端/服务器不支持你想要的。没有办法解决它。对不起。但是,有几十个 ftp 客户端。您可能会发现支持-p 选项的那个,但如果您在商业环境中执行此操作,您可能无法获得将该客户端安装到系统中的权限。更不用说你会花时间寻找它。 .....for loop 是你的朋友。祝你好运。
  • 是的,谢谢大家,我已经使用for loop...并逐渐建立当前的工作目录。
【解决方案2】:

改用 lftp:

[dong@idc1-server1 ~]$ lftp sftp://idc1-server2
lftp idc1-server2:~> ls
drwxr-xr-x    3 dong     dong         4096 Jun 16 09:11 .
drwxr-xr-x   18 root     root         4096 Apr  1 22:25 ..
-rw-------    1 dong     dong          116 Jun 16 09:28 .bash_history
-rw-r--r--    1 dong     dong           18 Oct 16  2013 .bash_logout
-rw-r--r--    1 dong     dong          176 Oct 16  2013 .bash_profile
-rw-r--r--    1 dong     dong          124 Oct 16  2013 .bashrc
drwx------    2 dong     dong         4096 Jul 24  2014 .ssh

lftp idc1-server2:~> mkdir a/b/c/d
mkdir: Access failed: No such file (a/b/c/d)

lftp idc1-server2:~> mkdir -p a/b/c/d
mkdir ok, `a/b/c/d' created

【讨论】: