如果在没有 ssh-ing 的情况下不存在远程主机上的目录,如何在它上创建目录?

Posted

技术标签:

【中文标题】如果在没有 ssh-ing 的情况下不存在远程主机上的目录,如何在它上创建目录?【英文标题】:How do I create a directory on remote host if it doesn't exist without ssh-ing in? 【发布时间】:2010-11-23 07:50:53 【问题描述】:

我不确定这是否可能。基本上,我正在编写一个脚本,允许我 scp 一个文件到我的主机。到目前为止就是这样。参数 1 是文件,参数 2 是我希望将其放置在远程服务器上的文件夹:

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

您可能/可能不知道,如果我在调用函数时指定的目录不存在,则传输失败。有没有办法检查函数中是否存在目录,如果不存在,则创建它。

我宁愿不必每次都 ssh 并创建目录,但如果我别无选择,那我别无选择。

【问题讨论】:

【参考方案1】:

sshfs 喜欢!

示例.ssh/config

Host your-host
  HostHame example.com
  User name
  IdentitiesOnly yes
  IdentityFile ~/.ssh/private_key

除了上面的本地设置只需要一个目标挂载点...

sudo mkdir /media/your-host
sudo chown $USER:$USER /media/your-host

...在这之后,诸如挂载和卸载之类的事情就更容易编写脚本了。

坐骑

sshfs your-host:within-home/some-dir /media/your-host

卸载

fusermount -u /media/your-host

当服务器允许时,这种方法最好的部分是本地运行的脚本可以与远程文件系统交互。这意味着像...

if ! [ -d "/media/your-host/nowhere" ]; then
  mkdir -vp "/media/your-host/nowhere"
fi

...在许多其他可以通过这种安装魔法执行的技巧中成为可能。

【讨论】:

【参考方案2】:

您可以使用rsync

例如,

rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO

注意rsync:

rsync 是用于 Unix 的实用软件和网络协议,可将文件和目录从一个位置同步到另一个位置。它通过使用比其他工具更快的rsync 算法在适当的时候使用增量编码来最小化数据传输大小。

【讨论】:

这对我不起作用(它只是抱怨目标目录不存在)——它是否需要非常新的 rsync 版本?但是,如果本地文件位于适当命名的目录中,则可以使用rsync -R 来达到预期的效果,例如:rsync -Rave ssh some/nonExisting/dirToCopyTo/fileToCopy ssh.myhost.net:/ 像@MartinKleppmann 我只收到一个错误,抱怨目录不存在使用它。你真的亲眼目睹了这个工作吗?如果是这样,我有兴趣弄清楚我们的 rsync 程序有什么不同。 啊,如果它只需要创建一个级别的目录来复制,看起来这样就可以了。我尝试部署到 /var/www/myapp/test/。当服务器只有 /var/www/ 时,它失败了。当我创建 /var/www/myapp/ 时,它创建了测试文件夹并将所有内容复制到其中。因此,如果您需要创建多个级别的目录结构,您将需要像下面的 @ire_and_curses 这样的解决方案。 确实只能创建一个级别。所以这可以工作rsync fileToCopy ssh.myhost.net:some_nonexisting_dir_to_copy_to 这对我不起作用,我看到你们使用伪“不存在的目录”作为目标,创建一个级别。然后 rsync 将仅复制源文件并将其放入具有新文件名的 dest 现有目录中。它不会创建目录。也许我误解了这一点,有人可以提供一个真实的命令吗?【参考方案3】:

这是一个两步过程

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

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

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

【讨论】:

【参考方案4】:

例如,ssh remote_user@remote.host '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt remote_user@remote.host:/tmp/nonexist/dir

【讨论】:

我肯定看到 SSHscp,根据*** ...is based on the Secure Shell (SSH) protocol. 这不是 OP 所要求的。 使用 ssh 或 scp 没有错,也没有必要避免它们。这完全取决于用户脚本应该记住在远程主机上创建的内容,因此不会一遍又一遍地进行检查。我其实最近用这个方法写了一个日志备份脚本。如果远程主机不提供诸如 CIFS、NFS、FTP 或 rsync(这个实际上是通过 ssh 运行)等远程文件访问方式,我很想知道是否还有其他选项可以检查并在远程主机上创建新文件夹。 对不起,如果我遇到错误的方式 Rico,我指的是 OP 不想使用 SSH,但我应该更仔细地阅读这个问题; scp 没问题。【参考方案5】:

我假设您的意思是您不想以交互方式登录并手动创建目录,而不是您想完全避免使用ssh,因为您仍然需要scp 的密码或公钥。

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

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

在哪里

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

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

【讨论】:

mkdir -p $3 避免 mkdir 抱怨已经存在的目录。此外,它还允许您创建多个级别的目录。【参考方案6】:

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

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

【讨论】:

如果远程目录已经存在(并且不为空)怎么办? 新内容将添加到现有目录中。

以上是关于如果在没有 ssh-ing 的情况下不存在远程主机上的目录,如何在它上创建目录?的主要内容,如果未能解决你的问题,请参考以下文章

无法在没有 $DISPLAY for X11 的情况下自动启动 dbus-daemon。网豆。 Pi 作为远程主机

如何在 MySQL 中执行“如果不存在则插入”?

00-2. Javascript 规范 及 注意事项

NullPointerException 堆栈跟踪在没有调试代理的情况下不可用

为啥 wctype.h 中的函数在没有 setlocale() 的情况下不起作用?

NoHandlerFoundException 的自定义异常处理程序在没有 @EnableWebMvc 的情况下不起作用