如何在远程主机上创build一个目录,如果它不存在而不存在?
我不确定这是否可行。 基本上,我正在写一个脚本,允许我scp文件到我的托pipe。 这是迄今为止。 参数1是文件,参数2是我希望它放在远程服务器上的文件夹:
function upload { scp $1 myusername@ssh.myhost.net:$2 }
正如你可能/不知道,如果我指定的目录,当我调用该函数不存在,那么传输失败。 有没有办法检查目录是否存在于函数中,如果不存在,请创build它。
我宁愿不必每次都要ssh来创build目录,但是如果我没有select的话,我就别无select了。
你可以使用rsync。
例如,
rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO
关于rsync的说明:
rsync是用于Unix的实用软件和networking协议,它将文件和目录从一个位置同步到另一个位置,同时通过使用delta编码最小化数据传输,适当时使用比其他工具更快的rsyncalgorithm。
我假设你的意思是你不想交互式地login和手动创build目录,而不是你想避免使用ssh
,因为你仍然需要一个密码或公共密钥与scp
。
如果以非交互方式使用ssh是可以接受的,那么你可以使用cat
over ssh
来stream式传输你的文件:
cat $1 | ssh $2 "mkdir $3;cat >> $3/$1"
哪里
$1 = filename $2 = user@server $3 = dir_on_server
如果该目录已经存在, mkdir
抱怨,但该文件仍然被复制。 现有的目录不会被覆盖。 如果该目录不存在, mkdir
将创build它。
如果你做一个recursionscp(-r),它也会复制目录。 因此,如果您在本地创build远程主机上所需的名称目录,则将该文件复制到该目录中,然后recursion复制,将创build目录,并将其中的文件创build。
有点尴尬,但它会做的工作。
这是一个两步的过程
ssh myusername@ssh.myhost.net "mkdir -p $2"
这确保了目录结构被创build。 然后,你复制
scp $1 myusername@ssh.myhost.net:$2
举个例子,
ssh remote_user@remote.host '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt remote_user@remote.host:/tmp/nonexist/dir