Como eu configuro o $ PATH para que o `ssh user @ host command` funcione?


129

Não consigo definir um novo $ PATH de modo que ele seja usado ao executar comandos via ssh user@host command. Tentei adicionar export PATH=$PATH:$HOME/new_pathao ~ / .bashrc e ~ / .profile na máquina remota, mas a execução ssh user@host "echo \$PATH"mostra que a alteração não foi detectada (mostra / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games). A máquina remota está executando o Ubuntu 8.04.

Tenho certeza de que poderia invadir o arquivo / etc / profile, mas essa não é uma solução limpa e só funciona quando se tem acesso root.


1
Eu tentei adicionar export PATH=$PATH:$HOME/new_pathos arquivos ~ / .bash_login e ~ / .bash_profile (além dos ~ / .bashrc e ~ / .profile anteriormente testados). Nem funciona. Nos dois casos, tive que criar o arquivo.
Denver Gingerich

No meu caso de uso específico, não é fácil modificar o comando enviado ao ssh. Estou usando o stfufs ( guru-group.fi/too/sw/stfufs ), que constrói o próprio comando ssh. Sei que seu método não é uma ótima solução, mas seria bom corrigi-lo sem modificar o stfufs.
Denver Gingerich

Você poderia colocar um invólucro ssh em modo stfufs, chamar o ssh real com args modificados, se é mais fácil
Hasturkun

Respostas:


179

Como o grawity disse, ~ / .bashrc é o que você deseja, pois é originário de shells não interativos e sem logon.

Espero que o problema que você está tendo tenha a ver com o arquivo padrão Ubuntu ~ / .bashrc. Geralmente começa com algo como isto:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Você deseja colocar qualquer coisa para shells não interativos antes desta linha.


1
Sim, mudei a export PATH=$PATH:$HOME/new_pathlinha acima e funcionou. Obrigado!
Denver Gingerich

3
.bashrc não é confiável. man bash: "O Bash tenta determinar quando está sendo executado com sua entrada padrão conectada a uma conexão de rede". Isso funciona no RHEL, mas não no Archlinux. Eu tive que editar / etc / ambiente para alterar o caminho padrão
bacia

Você deve adicionar menção .zshenvpara os usuários zsh, ele me levou muito tempo para encontrá-lo nos comentários sobre outras respostas
Mike

30

Você tem um ~/.bash_loginou ~/.bash_profile?

O Bash no modo interativo verifica esses arquivos e usa o primeiro existente , nesta ordem:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

Portanto, se você tiver um ~/.bash_profile, as alterações que fizer ~/.profileserão deixadas sem serem vistas.

O Bash no modo não interativo às vezes lê o arquivo ~/.bashrc(que também é frequentemente originário dos scripts interativos). Por "às vezes", quero dizer que depende da distribuição: estranhamente, há uma opção em tempo de compilação para habilitar isso. . O Debian permite a ~/.bashrcleitura, enquanto, por exemplo, o Arch não.

ssh parece estar usando o modo não interativo, então ~/.bashrcdeve ser o suficiente. Ao ter problemas como esse, geralmente adiciono alguns ecos para ver quais arquivos estão sendo executados.


Adicionar o eco ajudou ... mas ainda estou procurando uma maneira de executar 'ssh -X remotemachine "xterm"' e ter o sistema completo / caminho do usuário em / etc / profile e ~ / home / username / .bash_profile. Se eu fonte ambos os arquivos no comando, ele funciona .. mas é feio:).
21413 Jess

Como você sabe que "O Bash no modo não interativo lê o arquivo ~/.bashrc"? Não vejo essa declaração na página de manual. Obrigado
nknight

4
Se você deseja que um shell não interativo e sem login seja originado ~/.bashrc, parece que você precisa definir adicionalmente a variável de ambiente BASH_ENV; consulte superuser.com/a/585699/100843 . Para shells de logon não interativos, você provavelmente precisará modificar um dos três scripts de inicialização mencionados.
Nknight

3
Para ZSH, o arquivo não interativo é:.zshenv
math

2
@math .zshenvé sempre originário; não importa se é interativo ou não.
JOL

19

A documentação do ssh diz:

Se o comando for especificado, ele será executado no host remoto em vez de no shell de logon.

é por isso que adicionar aos arquivos bashrc não funciona. no entanto, você tem as seguintes opções:

  1. Se a PermitUserEnvironmentopção estiver definida na configuração do sshd, você poderá adicionar sua configuração PATH ao~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'


1. Não está definido na minha configuração do sshd e man sshd_configdiz que está desativado por padrão, portanto, é improvável que esta solução funcione para a maioria das pessoas. 2. Isso funcionaria, mas não posso modificar facilmente o comando enviado ao ssh (veja o segundo comentário na minha pergunta).
Denver Gingerich

1
1. Não funciona como esperado, porque em ~ / .ssh / environment, você não pode adicionar caminhos ao PATH, porque $ PATH não será resolvido.
not2savvy

8

Você sempre pode dizer:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'

Esta solução não precisa de alterações na máquina remota, o que é uma coisa boa.
Ronny Andersson

2

Além da resposta @signpolyma, você precisará adicionar sua exportação antes dessas linhas

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Na verdade, eu apenas comentei essas linhas por completo - encontradas em ~ / .bashrc no desktop Ubuntu 16.04 LTS. Nem tudo funciona. Defina também PermitUserEnvironment como yes.
Ernie S

2

Só tive o mesmo problema, resolvi-o com:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.