关于bash:如果没有ssh-ing,它如何在远程主机上创建目录?

 2019-09-09 

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,因为您仍然需要使用scp的密码或公钥。

如果以非交互方式使用ssh是可以接受的,那么您可以使用catssh上流式传输文件:

1
cat $1 | ssh $2"mkdir $3;cat >> $3/$1"

哪里

1
2
3
$1 = filename
$2 = user@server
$3 = dir_on_server

如果该目录已存在,mkdir会抱怨,但该文件仍会被复制。现有目录不会被覆盖。如果该目录不存在,mkdir将创建它。


如果你做一个递归的scp(-r),它也会复制目录。
因此,如果您在本地远程主机上创建所需名称的目录,将文件复制到其中,然后递归复制,将创建目录,其中包含文件。

有点尴尬,但它会做的工作。


这是一个两步过程

1
ssh myusername@ssh.myhost.net"mkdir -p $2"

这可确保创建目录结构。然后,你复制

1
scp $1 myusername@ssh.myhost.net:$2

例如,怎么样
<5233>


sshfs好看!

示例.ssh/config

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

......在通过这种装配魔法可以预先形成的许多其他技巧中成为可能。