Quando uso o rsync para copiar arquivos de um computador para outro, um processo rsync é iniciado nas duas extremidades. No entanto, no lado remoto, aparentemente, os arquivos de inicialização do shell não são lidos, portanto, não consigo configurar variáveis de ambiente para o processo rsync remoto. Infelizmente, há um servidor no qual preciso fazer o rsync no qual o rsync requer uma variável de ambiente para funcionar. Como não sou administrador no servidor, não posso alterar a configuração global. O que posso fazer para definir variáveis de ambiente para um processo remoto de rsync?
ssh
rsync
environment-variables
remote-connection
Ryan C. Thompson
fonte
fonte
rsync localfilename remotehost:remotefilename
, um processo rsync é iniciado no servidor. Eu não sei exatamente como, mas não lê arquivos de inicialização do shell.Respostas:
~/.profile
normalmente não é lido quando você executassh somecommand
, em oposição a uma sessão ssh interativa (ou outro método de login no qual você inicia uma sessão interativa).O Ssh suporta o envio de variáveis de ambiente. No OpenSSH, use a
SendEnv
diretiva em~/.ssh/config
. No entanto, a variável de ambiente específica deve ser ativada com umaAcceptEnv
diretiva na configuração do servidor , portanto, isso pode não funcionar para você.OpenSSH também permite definir variáveis de ambiente no lado do servidor. Novamente, isso deve estar ativado na configuração do servidor, aqui com a
PermitUserEnvironment
diretiva. As variáveis podem ser definidas no arquivo~/.ssh/environment
. Supondo que você use autenticação de chave pública, também é possível definir variáveis por chave em~/.ssh/authorized_keys
: addenvironment="FOO=bar"
no início da linha relevante.Uma coisa que eu acho que sempre funciona (por incrível que pareça), desde que você esteja usando autenticação de chave pública é (ab) usar a
command=
opção noauthorized_keys
arquivo. Uma chave com umacommand
opção é boa apenas para executar o comando especificado; mas o comando noauthorized_keys
arquivo é executado com a variável de ambienteSSH_ORIGINAL_COMMAND
definida para o comando especificado pelo usuário (vazio para sessões interativas). Portanto, você pode usar algo assim em~/.ssh/authorized_keys
(é claro, isso não se aplicará se você não usar essa chave para autenticar):Observe que eu coloquei as quebras de linha acima para legibilidade, mas isso realmente precisa estar tudo em uma linha.
Outra possibilidade é escrever um script de wrapper
~/bin/rsync-wrapper
no servidor, algo comoEm seguida, passe
--rsync-path='bin/rsync-wrapper'
narsync
linha de comando. O argumento to--rsync-path
é expandido por um shell; portanto, se você preferir, pode tornar a linha de comando do rsync independente, passando algo como--rsync-path='. ~/.profile; rsync'
.Existe outro caminho que depende do seu shell de login ser bash ou zsh. O Bash sempre lê
~/.bashrc
quando é invocado por rshd ou sshd, mesmo que não seja interativo (mas não se for chamado comosh
). Zsh sempre lê~/.zshenv
.fonte
$PATH
scripts shell init.PATH
em consideração, deve poder definir qualquer outra variável lá. (Se isso não funcionar, tente adicionar o maior número possível de rastreamentos, começandoset -x
em qualquer script de shell; substitua orsync
binário por um script de wrapper que despeja o ambiente em um arquivo e depois chama o binário real.)~/.ssh/rc
?~/.ssh/rc
é executado por um processo de shell separado. Eu acho que sua melhor aposta é um script de wrapper ou--rsync-path='. ~/.profile; rsync'
. Ou recompilarrsync
com um rpath adequado conforme sua outra pergunta.