Eu tenho um usuário que não fez modificações no $ PATH em nenhum arquivo de ponto: é exatamente a configuração padrão do sistema. Em um shell de login:
$ ssh example.com
user@example.com:~$ cat /tmp/hello.hs
#!/bin/bash
echo "$SHELL"
echo "$PATH"
user@example.com:~$ /tmp/hello.hs
/bin/bash
/usr/local/bin:/usr/bin:/bin
Exatamente como especificado em /etc/profile
. Acho isso inesperado:
$ ssh example.com '/tmp/hello.sh'
/bin/bash
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
Como eu disse, não há modificação de $ PATH ~/.bashrc
nem em /etc/bash.bashrc
. Também ~/.ssh/environment
não. O ssh(1)
declara que a variável de ambiente PATH
é
Defina como PATH padrão, conforme especificado ao compilar ssh.
mas esta discussão de StackOverflow e esta lista de discussão artigo sugerem que eu deveria ser capaz de influenciar o $ PATH para um determinado comando simplesmente modificando / etc / profile, um dos arquivos do shell de inicialização, etc.
Oque esta acontecendo aqui?
.bashrc
pode funcionar também, mas no geral eu contornaria se PATH for importante. Ou por que não apenas especificar nomes de caminho completos se você precisar da maneira 'command' de executar o ssh? :)bash(1)
INVOCATION sugere que nenhum arquivo de inicialização seja lido dessa maneira, mas não consigo encontrar documentação sobre como o ssh está chamando o shell. Isso parece contrário às fontes vinculadas acima, a menos que outras pessoas tenham o arquivo de inicialização / etc / ssh / sshrc que eu não possuo. (Existem soluções alternativas, é claro, mas o ponto é entender exatamente como Debian SSHD lida com caminhos por padrão.)/etc/profile
minhas atualizações de caminho da caixa remota para mim, serássh user@remotebox 'env'
exibido o PATH atualizado. A mesma coisa acontece se eu adicionarexport PATH=$PATH:/my/testpath
a .bashrc (mas no meu caso no topo do arquivo antes de cheques para shells interativos (-z "$PS1"
).Consegui que o ssh execute comandos usando o caminho remoto executando:
Aqui, env pode ser substituído por qualquer comando que você desejar.
Eu tenho chaves autorizadas, portanto não precisava de uma senha para executar o comando ou ssh.
fonte
Eu vim com uma solução diferente para corrigir o problema. Minha preferência pessoal é criar novos arquivos de configuração em vez de alterar os existentes. Dessa forma, posso facilitar a alteração das alterações da configuração padrão.
Aqui estão os conteúdos de
/etc/profile.d/ssh_login.sh
:Usando
dropbear
no lugar deopenssh-server
(isso também deve funcionar com o openssh), a variável SSH_CONNECTION é definida automaticamente quando eu faço logon remotamente. Criei uma nova configuração de perfil de shell para detectar logins SSH, exibir algumas informações na tela e, mais importante, carregar as configurações do ambiente global/etc/environment
para substituir os valores compilados. Observe que isso afeta apenas shells SSH interativos, não a execução de comandos remotos.Como alternativa , se você usar o openssh e sempre desejar carregar o ambiente global, independentemente de ser um shell interativo, poderá colocar um link simbólico da
~/.ssh/
seguinte maneira:Então você precisa habilitar a
PermitUserEnvironment
opção/etc/sshd/sshd_config
. Entretanto, faça isso apenas para usuários confiáveis, pois isso poderá permitir que eles ignorem as restrições de acesso em algumas configurações usando mecanismos como LD_PRELOAD. Consulteman sshd_config
para obter mais informações, especificamente como usarMatch
blocos para restringir opções a usuários / grupos específicos.fonte
Se você deseja que o caminho do perfil seja carregado, tente:
no topo do script. Dessa forma, o shell está no modo interativo ao executar o script.
http://linux.die.net/man/1/bash
fonte