How do I create a directory on remote host if it doesn't exist without ssh-ing in?
我不确定这是否可行。 基本上,我正在编写一个脚本,允许我将文件scp到我的主机。 到目前为止这是它。 参数1是文件,参数2是我希望它放在远程服务器上的文件夹:
1 2 3 | function upload { scp $1 myusername@ssh.myhost.net:$2 } |
您可能/可能不知道,如果我在调用函数时指定的目录不存在,则传输失败。 有没有办法检查函数中是否存在该目录,如果没有,则创建它。
我宁愿不必每次都ssh并创建目录,但如果我别无选择,那我别无选择。
您可以使用rsync。
例如,
1 | rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO |
关于rsync的注意事项:
rsync是Unix的实用程序软件和网络协议,它将文件和目录从一个位置同步到另一个位置,同时在适当时使用delta编码最小化数据传输,使用比其他工具更快的rsync算法。
我假设您的意思是您不希望以交互方式登录并手动创建目录,而不是您想要完全避免使用
如果以非交互方式使用ssh是可以接受的,那么您可以使用
1 | cat $1 | ssh $2"mkdir $3;cat >> $3/$1" |
哪里
1 2 3 | $1 = filename $2 = user@server $3 = dir_on_server |
如果该目录已存在,
如果你做一个递归的scp(-r),它也会复制目录。
因此,如果您在本地远程主机上创建所需名称的目录,将文件复制到其中,然后递归复制,将创建目录,其中包含文件。
有点尴尬,但它会做的工作。
这是一个两步过程
1 | ssh myusername@ssh.myhost.net"mkdir -p $2" |
这可确保创建目录结构。然后,你复制
1 | scp $1 myusername@ssh.myhost.net:$2 |
例如,怎么样
<5233>
示例
1 2 3 4 5 | Host your-host HostHame example.com User name IdentitiesOnly yes IdentityFile ~/.ssh/private_key |
除了上面的本地设置只需要一个目标安装点......
1 2 | sudo mkdir /media/your-host sudo chown ${USER}:${USER} /media/your-host |
...之后安装和卸载之类的东西比脚本简单得多。
安装
1 | sshfs your-host:within-home/some-dir /media/your-host |
卸载
1 | fusermount -u /media/your-host |
当服务器允许时,这种方法的最佳部分是本地运行的脚本可以与远程文件系统交互。意思是......
1 2 3 | if ! [ -d"/media/your-host/nowhere" ]; then mkdir -vp"/media/your-host/nowhere" fi |
......在通过这种装配魔法可以预先形成的许多其他技巧中成为可能。