Quero usar o scp
upload de arquivos, mas às vezes o diretório de destino pode não existir.
É possível criar a pasta automaticamente? Se sim, como? Caso contrário, que maneira alternativa posso tentar?
Essa é uma das muitas coisas que rsync
podemos fazer.
Se você estiver usando uma versão rsync
lançada nos últimos anos, ¹ sua sintaxe básica de comando é semelhante a scp
: ²
$ rsync -r local-dir remote-machine:path
Isso copiará local-source
e seu conteúdo para $HOME/path/local-dir
a máquina remota, criando os diretórios necessários.³
rsync
possui algumas restrições aqui que podem afetar se isso funcionará em sua situação específica. Não criará vários níveis de diretórios remotos ausentes, por exemplo; ele criará apenas um nível ausente no controle remoto. Você pode contornar isso facilmente precedendo o rsync
comando com algo como isto:
$ ssh remote-host 'mkdir -p foo/bar/qux'
Isso criará a $HOME/foo/bar/qux
árvore se ela não existir. Não vai reclamar ou fazer qualquer outra coisa ruim se ele não existir.
rsync
às vezes tem outros comportamentos surpreendentes. Basicamente, você está pedindo para descobrir o que pretende copiar, e suas suposições podem não corresponder às suas suposições. Experimente e veja. Se não se comportar conforme o esperado e você não conseguir entender o motivo, poste mais detalhes sobre as configurações de diretório local e remoto e dê o comando que você tentou.
Notas de rodapé :
Antes da rsync
versão 2.6.0 (1 de janeiro de 2004), era necessário que o -e ssh
sinalizador se comportasse como scp
padrão, porque o padrão era o obsoleto protocolo RSH .
scp
e rsync
compartilhe algumas bandeiras, mas há apenas um pouco de sobreposição.
Ao usar SSH
como protocolo de transferência, rsync
usa os mesmos padrões. Assim, da mesma forma scp
, assumirá que há um usuário com o mesmo nome que o usuário local na máquina remota por padrão.
rsync
página de documentação da pesquisa , não encontrou como usar o ssh-key para fazer login. Eu não quero usar nome de usuário / senha para fazer loginrsync
. E sim, você também precisarsync
do lado remoto, assim como comscp
. Quanto às chaves SSH,rsync
na verdade , ela está usando o SSH abaixo do padrão-e ssh
; portanto, se você tiver chaves configuradas para usoscp
, elas funcionarãorsync
também.-r
não faz diferença. O cenário que você descreve apenas funciona se você estiver copiando um diretório e se o diretório pai de destino existir. Portanto,rsync foo/ u@h:~/
criará o diretório de destino,foo
masrsync foo/ u@h:~/bar/
não o criarábar
. Esse criarábar/foo
apenas sebar/
existir. De qualquer forma, o OP está carregando arquivos e, mesmo nos casos em que isso funciona, funciona apenas para diretórios inteiros.rsync file host:/foo/file
falha sefoo/
não existir, masrsync file host:/foo/
cria o diretório e os locaisfile
nele. Estranho. De qualquer forma, você está certo e o cenário básico funciona, eu retiro meu voto negativo.Se você estiver copiando um grupo de arquivos, na verdade não. Se você estiver copiando um diretório e todo o conteúdo abaixo dele, sim. Dado este comando:
Se
directory
não existir no~/the/target
nohost
, ele será criado. Se, no entanto,~the/target
não existir, você provavelmente terá problemas - não me lembro dos resultados exatos deste caso, mas esteja preparado para ascp
falha pretendida .fonte
scp: /home/madmike/test_bin: No such file or directory
Assim que o diretório de destino estiver ausente, isso será interrompido na minha instalação. Usando o cygwin no cliente e o RHEL 6.9 no servidor. Qual é a sua configuração?Tanto quanto eu sei,
scp
ele próprio não pode fazer isso, não. No entanto, você pode apenasssh
para a máquina de destino, criar o diretório e depois copiar. Algo como:Observe que, se você estiver copiando diretórios inteiros, o acima não será necessário. Por exemplo, para copiar o diretório
~/foo
para o host remoto, você pode usar o-r
sinalizador (recursivo):Isso criará o diretório de destino
~/foo
no host remoto. No entanto, ele não pode criar o diretório pai.scp ~/foo user@host:~/bar/foo
falhará a menos que o diretório de destinobar
exista. De qualquer forma, o-r
sinalizador não ajudará a criar um diretório de destino se você estiver copiando arquivos individuais.fonte
Sim você pode. De acordo com a página de manual do scp:
fonte
scp -r foo/ u@h:~/bar
criarábar/foo
se o controle remotobar/
existir, mas falhará se não existir.foo
conteúdo para o novo diretório/bar
. É claro que o nome foi alterado, o que pode não ser o que o OP deseja. Se o que você deseja é uma nova estrutura em árvore criada na máquina de destino, entãoscp
não fará o trabalho, se o que você deseja é replicar uma estrutura em árvore a partir de uma determinada ramificação na árvore, essa estrutura será criada.scp -r file host:~/bar/
não criarábar/
.Eu uso a seguinte função antes de transferir
btrfs
instantâneosssh
:Basta chamar a função no seu script com:
check_remote_dir /my/remote/path
fonte
Você pode encadear o comando com o comando mkdir e fazer referência à pasta que você criou:
fonte
Quando restrito a apenas scp ou sftp sem ssh disponível (por rssh), é possível criar diretórios copiando a árvore de diretórios vazia com o rsync e depois copiando os arquivos.
É assim que eu coloco a chave pública ssh no host remoto quando ssh-copy-id não funciona e o diretório .ssh não existe:
É possível combinar esses comandos em um rsync, adicionando mais um filtro de inclusão no meio, se o nome do arquivo de destino for o mesmo.
fonte