53

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

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

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

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

4

6 回答 6

35

您可以使用rsync.

例如,

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

注意事项rsync

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

于 2009-08-27T10:12:30.590 回答
25

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

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

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

在哪里

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

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

于 2009-08-27T10:39:45.340 回答
19

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

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

于 2009-08-27T10:09:29.253 回答
13

这是一个两步过程

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

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

scp $1 myusername@ssh.myhost.net:$2
于 2013-07-24T05:04:43.093 回答
6

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

于 2011-07-08T12:59:42.130 回答
0

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

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

于 2019-07-25T05:14:06.160 回答