Meu problema é que eu tenho que definir variáveis env (como GIT_EXEC_PATH) em um servidor. Eu preciso dessas variáveis por todas as conexões (por bash e por comandos remotos). Consegui definir essas variáveis bash com .bash_profile, mas tenho problemas com os comandos remotos. Descobri que é possível escrever comandos em ~ / .ssh / allowed_keys antes da chave rsa real, mas não quero escrever sempre, preciso de uma solução permanente ... descobri que o ~ / .ssh O arquivo / rc é executado por todo login do ssh, então coloquei lá minhas declarações de variáveis env, mas não funcionou. As variáveis são definidas no arquivo rc, mas depois desaparecem. : S Talvez o arquivo rc seja executado em um subshell: S Existe alguma maneira de definir essas variáveis no bash e em comandos remotos sem duplicação de código?
Editar:
Eu editei a pergunta, porque o servidor é um host compartilhado, então ele tem uma configuração exclusiva. Os arquivos / etc / ssh / sshd_config e / etc / ssh / ssh_config estão vazios. Existem comentários nesses arquivos, se você estiver curioso, posso copiá-lo aqui.
- O ~ / .bash_profile é originado (somente por conexões bash),
- o ~ / .bashrc nunca é originado,
- o perfil ~ /. nunca é originado,
- o ambiente ~ / .ssh / nunca é originado,
- o ~ / .ssh / rc é originário (por bash e remoto), mas acho que é chamado subshell, porque as variáveis desaparecem.
- As ~ / .ssh / allowed_keys são originadas sempre, mas eu tenho que escrever os comandos antes de cada chave rsa (para que eu não queira configurar com isso).
Resumo:
Posso configurar bem o bash (com .bash_profile), mas não consigo configurar as chamadas remotas. Esse é o problema. Estou procurando um arquivo que é originado por comandos bash e remoto.
Por exemplo:
O comando git-upload-pack localiza o arquivo exe, porque a variável env GIT_EXEC_PATH está definida, mas com remote: "git clone [email protected]: myrepo local / myrepo" o servidor não encontra esse comando, porque o GIT_EXEC_PATH não está definido.
Edit2:
De acordo com isso , e meus registros printenv: o ~ / .ssh / rc está sendo executado no shell normal, não no subshell, por isso é um enigma porque as variáveis env não estão aderindo ...
Eu criei um executável: ~ / logenv :
echo "" >> mylog.txt
date >> mylog.txt
printenv >> mylog.txt
echo "" >> mylog.txt
E coloque isso no ~ / .ssh / rc :
export AAA=teszt
source ~/logenv
Por login do bash e "logenv de origem", o resultado foi:
Tue May 15 04:21:37 MST 2012
TERM=cygwin
SHELL=/bin/bash
SSH_CLIENT=censored
SSH_TTY=/dev/pts/2
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv
Tue May 15 04:21:41 MST 2012
HOSTNAME=censored
TERM=cygwin
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=censored
Por remoto "ssh [email protected] 'exec ~ / logenv'", o resultado foi:
Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv
Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
PATH=/usr/local/bin:/bin:/usr/bin
MAIL=/var/mail/myuser
PWD=/home/content/65/7962465
HOME=/var/chroot/home/content/65/7962465
Portanto, o arquivo rc é originado, mas depois disso as variáveis desaparecem ...: S
fonte
Respostas:
Supondo que você tenha
UsePAM yes
participado/etc/ssh/sshd_config
e assumindo que deseja que essas variáveis de ambiente sejam definidas para todos os usuários, você pode ter variáveis de ambiente definidas por eles. Se você tiver as variáveis de ambiente definidas,/etc/gitenv
poderá adicionar esta linha ao/etc/pam.d/sshd
Ou ao inserir este arquivo, você pode achar que já existe um pam_env.so sendo usado e já existe um arquivo no qual você pode adicionar itens. Apenas tome cuidado e certifique-se de ter testado minuciosamente suas alterações antes de encerrar sua sessão ssh, pois quando estiver mexendo com o pam, você poderá interromper completamente sua capacidade de fazer login no servidor, se não tiver cuidado.
fonte
/etc/environment
é originado porpam_env.so
por padrãoEstou definindo alguma variável de ambiente para minhas conexões SSH usando o
~/.ssh/environment
. O arquivo pode conter variáveis no formulárioVAR=value
, sem necessidade de exportá-las explicitamente.No entanto, esse arquivo de configuração do usuário é ignorado por padrão pelo processo do servidor SSH, a menos que a opção PermitUserEnvironment esteja configurada como yes. Portanto, você precisa editar / etc / sshd_config no servidor SSH para adicionar ou atualizar este parâmetro:
Você precisa recarregar a configuração do servidor SSH. No RHEL ou Suse Linux, você faz (como root)
(Possivelmente substitua sshd por ssh se não funcionar)
No Ubuntu (usando o iniciante), você faz
Em qualquer outro Linux, você pode tentar (como root)
(Substitua sshd por ssh ou openssh ou o que corresponder ao script de inicialização do servidor SSH)
fonte
Eu não tenho mais um host compartilhado, então não posso verificar se as soluções propostas são válidas. Esta será a resposta aceita, pois funcionou por mim quando fiz a pergunta. As outras respostas podem funcionar também. Eu deixei a comunidade decidir isso com votos positivos.
Está bem. A solução é que não há solução em um host compartilhado como um godaddy. Eu tentei de tudo, mas nada funciona, então decidi ficar com as ~ / .ssh / allowed_keys:
No ~ / connect.sh:
E no ~ / .env_profile:
Então eu tenho que copiar o comando = "..." para cada chave rsa nas chaves_autorizadas. Isso é duplicação de código, mas não acho que exista outra solução em hosts compartilhados de maneira adequada.
fonte
Se você estiver usando
bash
como seu shell, tente adicionar as configurações de ambiente.bashrc
.Verifique primeiro se isso é executado no login, pois pode não ter, pois os arquivos padrão geralmente têm algo como:
no início deles. qualquer alteração que você queira fazer, mesmo para logons não interativos, precisará ir além dessa declaração.
.profile
é um lugar mais geral para colocar configurações como esta e é respeitado pela maioria dos shells (em uma configuração padrão do Debian é o~/.profile
que chama~/.bashrc
em primeiro lugar). Pode ser necessário ter uma edição mais cuidadosa.profile
, caso seja interpretada por outros shells - ou seja, tente evitar o uso debash
extensões específicas.Editar
Se você tiver uma
.bash_profile
edição que, em vez de.profile
: bash, a usará em favor do arquivo mais geral, e você poderá usar com segurança itens específicos do bash.fonte
Você pode usar o comando para todos os usuários / chave sem adicionar a parte do comando nas allowed_keys, adicionando esta linha ao arquivo sshd_config:
Nesse caso, sugiro que você use um caminho absoluto para o script
fonte
Estou propondo outra abordagem.
Você configura um arquivo com a declaração da sua variável de ambiente e o origina cada vez que chama um comando remoto.
Exemplo: você coloca as variáveis necessárias em ~ / .my_var.rc e, em seguida, para cada comando remoto que executa
ssh user@remote bash -c "source ~/.my_var.rc; <your command>"
Se isso lhe convier, você poderá refinar esse conceito e criar um script por conveniência. Se você precisar apenas para comandos git, eu criaria um script git.sh que faria isso:
Supondo que esse script esteja no seu diretório pessoal, você poderia chamá-lo:
ssh user@remote git.sh pull origin master
Nota: é um ponto de partida simples. Por exemplo, ele não suporta parâmetros com espaços.
fonte
ssh -Y user@remote git.sh gui
Isso não responde à pergunta geral sobre PATHS, mas permite que você use um repositório git em um servidor remoto que não tenha git em seu caminho e ao qual você não tenha acesso root. Esta solução vem desta página .
Para também empurrar e buscar:
fonte
O / etc / profile será originado em cada conexão com o ssh-client.
fonte