arquivo de ponto não originado ao executar um comando via ssh

11

Quando executo meu programa interativamente, ele funciona bem:

ssh somehost
$ ~/some/path/somescript.py

Quando executo meu programa diretamente no ssh, ele não funciona. A variável PYTHONPATHnão está definida, porque .bashrcnão é originada.

ssh somehost ~/some/path/somescript.py

Se eu correr ssh somehost 'source ~/.bashrc; ~/some/path/somescript.py', funciona bem.

Mas o último não funcionaria para outras pessoas, por exemplo, usando o tcsh e não tendo um ~/.bashrc).

Qual é o comando para executar uma coisa via ssh em outro host que funcione para todos os shells?

bzdjamboo
fonte
1
Respondido aqui, stackoverflow.com/questions/820517/bashrc-at-ssh-login , basicamente, o ssh não gera .bashrc, você precisa originar seu .bashrc via .bash_profile ou outras opções.
EightBitTony
1
@ EightBitTony: Não, isso é uma questão diferente. A pergunta de bzdjamboo é sobre uma sessão não interativa.
Gilles 'SO- stop be evil'
Na verdade, a última resposta no link que publiquei parece ser valiosa, o ssh fornece o .bashrc, mas não é executado devido à verificação de ser interativo. No entanto, aprecio que sua resposta cubra todas as bases.
precisa
3
@ EightBitTony: Nessa questão, a resposta aceita é uma boa solução para o solicitante, mas as respostas não contam a história completa. O próprio SSH não gera nada. Se o seu shell de logon for chamado como bash bash, ele origina .bash_profileou .profilepara um logon interativo e .bashrcpara um logon não interativo. Se o seu shell de login for chamado bash como shou ash ou ksh, ele cria .profileum logon interativo e nada para um logon não interativo.
Gilles 'SO- parar de ser mau'

Respostas:

12

Não há arquivo padrão por usuário executado para logins não interativos. Você precisa tornar o programa independente, para poder encontrar suas dependências sem depender de variáveis ​​de ambiente não padrão ou definir explicitamente o ambiente, geralmente com

ssh somehost '. ~/.profile; exec ~/some/path/somescript.py'

Você não deve definir variáveis ​​de ambiente em .bashrc: este arquivo é destinado a shells interativos e é lido em cada instância do bash. As variáveis ​​de ambiente devem ser definidas .profile, que são lidas quando você faz login. Além do número muito pequeno de pessoas que não usam um shell no estilo Bourne como seu shell de logon, .profilefunciona para todos, independentemente de usar bash ou zsh ou csh ou fish interativamente. Consulte também Diferença entre .bashrc e .bash_profile , Quais arquivos de instalação devem ser usados ​​para configurar variáveis ​​de ambiente com o bash? .

Dito isto, existe uma maneira de obter um script sempre que você faz logon no ssh com uma chave específica. Consulte Existe uma maneira de enviar informações de configuração do shell ao fazer o SSH em um host? , sh arquivos de inicialização sobre ssh .

Gilles 'SO- parar de ser mau'
fonte
Agora, como faço para marcar "respondido"? :-)
bzdjamboo
No lado esquerdo desta seção de respostas, deve haver setas para cima e para baixo e um contador de votos. Logo abaixo, deve haver o contorno de uma caixa de seleção. Você pode clicar para ativar a função de aceitação de resposta.
Caleb
Obrigado a todos novamente, mas, aparentemente, suas respostas não resolveram o meu problema.
bzdjamboo
Aqui está uma formulação um pouco mais recente do problema e minha compreensão atual da raiz dele.
bzdjamboo
Parece que não posso adicionar mais de 60 caracteres aqui, então tenho que fazer minha pergunta separadamente novamente. Desculpe ab. naquela. Novamente, este não está resolvido, e cavar muito mais por alguns dias não ajudou.
bzdjamboo
0

Eu tinha o mesmo problema, mas para mim a solução era diferente. Meu usuário não foi configurado para usar o bash como shell, mas sim o zsh como shell; portanto, os arquivos do bash dot não foram executados no logon. Abra / etc / passwd com um editor de texto e procure seu nome de usuário e qual shell ele usa:

root:x:0:0:root:/root:/bin/zsh

É assim que minha entrada de usuário se parece. Observe que diz / bin / zsh em vez de / bin / bash. Para zsh, o arquivo de ponto correto é ~ / .zprofile. Seu conteúdo será executado toda vez que você fizer login usando ssh.

Martin Hansen
fonte