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?
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?
Respostas:
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 login
rsync
. E sim, você também precisa rsync
do lado remoto, assim como com scp
. 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 uso scp
, elas funcionarão rsync
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
mas rsync foo/ u@h:~/bar/
não o criará bar
. Esse criará bar/foo
apenas se bar/
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 se foo/
não existir, mas rsync file host:/foo/
cria o diretório e os locais file
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:
$ scp -pr /source/directory user@host:the/target/directory
Se directory
não existir no ~/the/target
no host
, 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 a scp
falha pretendida .
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 apenas ssh
para a máquina de destino, criar o diretório e depois copiar. Algo como:
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
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):
scp ~/foo/ user@host:~/
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 destino bar
exista. De qualquer forma, o -r
sinalizador não ajudará a criar um diretório de destino se você estiver copiando arquivos individuais.
Sim você pode. De acordo com a página de manual do scp:
man scp
.....
-r Copia recursivamente diretórios inteiros. Observe que o scp segue links simbólicos encontrados no percurso da árvore.
....
scp -r foo/ u@h:~/bar
criará bar/foo
se o controle remoto bar/
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ão scp
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âneos ssh
:
check_remote_dir() {
printf "\ntesting remote directory: '$1' "
if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
printf "\nCreating: $1 on $ROOT@$REMOTE\n"
ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
else
printf "[OK]\n"
fi
}
Basta chamar a função no seu script com:
check_remote_dir /my/remote/path
Você pode encadear o comando com o comando mkdir e fazer referência à pasta que você criou:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
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:
rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys
É 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.