如何在远程主机上创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