我不确定这是否可行。基本上,我正在写一个脚本,允许我scp一个文件到我的主机。到目前为止这是它。参数1是文件,参数2是我希望它放在远程服务器上的文件夹:
function upload {
scp $1 myusername@ssh.myhost.net:$2
}
您可能/可能不知道,如果我在调用该函数时指定的目录不存在,则传输失败。有没有办法检查函数中是否存在该目录,如果没有,则创建它。
我宁愿不必每次都使用ssh并创建目录,但如果我别无选择,那么我别无选择。
答案 0 :(得分:32)
您可以使用rsync。
例如,
rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO
关于rsync的注意事项:
rsync是Unix的实用程序软件和网络协议,它将文件和目录从一个位置同步到另一个位置,同时在适当时使用delta编码最小化数据传输,使用比其他工具更快的rsync算法。
答案 1 :(得分:24)
我认为你的意思是你不想手动交互式登录和创建目录,而不是想要完全避免使用ssh
,因为你仍然需要一个密码或公钥{{1 }}
如果以非交互方式使用ssh是可以接受的,那么您可以使用scp
通过cat
流式传输文件:
ssh
,其中
cat $1 | ssh $2 "mkdir $3;cat >> $3/$1"
如果目录已存在,$1 = filename
$2 = user@server
$3 = dir_on_server
会抱怨,但文件仍然被复制。 不会覆盖现有目录。如果目录不存在,mkdir
将创建该目录。
答案 2 :(得分:19)
如果你做一个递归的scp(-r),它也会复制目录。 因此,如果您在本地远程主机上创建所需名称的目录,将文件复制到其中,然后递归复制,将创建该目录,并在其中包含该文件。
有点尴尬,但它会起作用。
答案 3 :(得分:13)
这是一个两步过程
ssh myusername@ssh.myhost.net "mkdir -p $2"
这可确保创建目录结构。然后,你复制
scp $1 myusername@ssh.myhost.net:$2
答案 4 :(得分: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
答案 5 :(得分:0)
sshfs
看中!
示例.ssh/config
Host your-host
HostHame example.com
User name
IdentitiesOnly yes
IdentityFile ~/.ssh/private_key
除了上面的本地设置,只需要一个 target 挂载点...
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
...在许多其他技巧中都可以实现,而这些技巧可以通过这种魔咒来实现。