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.

Denver Gingerich
fonte
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.

singpolyma
fonte
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.

user1686
fonte
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"'

Hasturkun
fonte
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'
Chas. Owens
fonte
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
Happy Coding
fonte
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
Indie
fonte