Como definir o PATH ao executar um comando ssh?

9

Supondo que o usuário tenha /bin/bash como o shell em /etc/passwd . Então ssh user@host command executa o comando usando Bash. No entanto, esse shell não é nem logado nem interativo, o que significa que nem ~/.bash_profile nem ~/.bashrc é originado. Nesse caso, como definir a variável de ambiente PATH para que os executáveis possam ser encontrados e executados? Recomenda-se prefixar o comando real com source ~/.bashrc ?

    
por Cyker 24.12.2016 / 10:20

2 respostas

6

Você tem poucas possibilidades:

  • Defina o PATH no servidor ~/.ssh/environment (precisa ser ativado por PermitUserEnvironment yes in sshd_config ).
  • Use o caminho completo para o binário
  • Como você mencionou, forneça manualmente .bashrc : prefixe o comando com . ~/.bashrc (ou source )

Depende bastante do caso de uso, por onde você irá.

    
por 24.12.2016 / 10:29
5

Você está igualando as configurações locais às configurações remotas .

Localmente, uma instância do bash, o shell em execução no qual você escreve:

ssh user@host command

Vai executar o comando ssh (nada mais) como um cliente ssh.
Para fazer isso, o shell local precisa não para iniciar um sub-shell ou um novo shell ou login.

O comando é executado como um comando ls é: localmente.

É o comando ssh do cliente que abre uma conexão de rede para um sistema remoto , onde, se autenticado corretamente, um shell novo será iniciado para executar o comando escrito como um argumento para ssh, ou, se nenhum argumento for fornecido, espere mais comandos nessa conexão.

Esse novo shell Remoto necessariamente será um shell de login, pois o usuário remoto (para esse sistema) precisa ser autenticado para efetuar login. Ou, se algum comando específico for fornecido, basta executar esse comando com os privilégios de usuário autenticados.

Você pode ver quais arquivos são originados adicionando um $file sourced ao início de cada arquivo (no sistema remoto ) (o root é necessário para alterar os arquivos /etc/ ):

$ a=(~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile)
$ for f in "${a[@]}"; do sed -i '1 i\echo "'"$f"' was read"\n' "$f"; done

E depois é só iniciar um console do ssh:

$ ssh sorontar@localhost
/etc/profile was read
/etc/bash.bashrc was read
/home/sorontar/.profile was read
/home/sorontar/.bashrc was read

Nesse caso, os dois arquivos bashrc foram lidos porque cada arquivo profile tinha comandos para incluí-los, não porque o shell de login os originasse diretamente.

$ ssh sorontar@localhost :
/etc/bash.bashrc was read
/home/sorontar/.bashrc was read

Neste sistema, onde bashrc é lido em ambos os casos.

Não é necessário adicionar source ~/.bashrc ao comando para executar.

Alterar o PATH

Tudo o que você precisa fazer é incluir as configurações corretas para alterar o "$ PATH", seja em /etc/bash.bashrc para todos os usuários que iniciam um shell neste sistema. Ou em ~/.bashrc para cada usuário que precisar. Você pode adicionar (ou editar) um esqueleto de um usuário .bashrc to /etc/skel/ para que qualquer novo usuário criado tenha o arquivo correto disponível.

O acima é válido apenas para bash. Se você precisar que a configuração funcione para todos os shells, provavelmente configurando a variável de ambiente PATH usando o arquivo ssh ~/.ssh/environment para cada usuário que precisar. Ou use /etc/ssh/sshrc para uma configuração global no sistema em que o servidor ssh está em execução (por favor, leia a seção Arquivos em man sshd para mais detalhes).

    
por 25.12.2016 / 04:51

Tags