Eu tenho alguns comandos importantes que preciso executar antes que qualquer sh shell seja iniciado. Isso é necessário para a passagem de comandos SSH no comando SSH ( ssh host somecommand
) e outros programas que executam comandos.
No meu .profile
eu tenho isso:
ihammerhands@wreckcreations:~> cat .profile
#specific environment and startup programs
export PS1="\u@wreckcreations:\w> "
export PYTHONPATH=~/python/lib/python2.4/site-packages
export PATH=$PATH:~/bin:~/python/bin
No entanto, isso falha:
W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH
Enter passphrase for key '/home/Owner/.ssh/id_rsa':
/usr/local/bin:/bin:/usr/bin
Observe as opções PATH ausentes
Qual é o nome apropriado para o perfil sh? Nota: Eu não tenho acesso root e não quero que isso seja aplicado a outros usuários. Há outra maneira de fazer isso?
EDIT: Parece /bin/sh
links para bash
, o que não é surpreendente. O que é surpreendente é que meu perfil ainda é ignorado. Alguma sugestão?
ssh name@host -t echo $PATH
.Respostas:
Parece interessante notar que o comando que você mencionou na sua pergunta
praticamente nunca será útil. A substituição da variável por $ PATH é feita pelo shell local e passada para o ssh, que executa eco no sistema remoto para imprimir o conteúdo da variável do caminho, à medida que se expandia no sistema local. Aqui está um exemplo de mim fazendo algo semelhante entre o meu Mac e uma máquina Linux na minha rede:
Observe como eu precisava usar aspas para impedir que meu shell local expanda a variável.
fonte
~/.profile
é executado apenas por shells de login. O programa que chama o shell decide se o shell será um shell de logon (colocando a-
como o primeiro caractere do argumento zeroth na invocação do shell). Normalmente não é executado quando você efetua login para executar um comando específico.O OpenSSH, em particular, chama um shell de login apenas se você não especificar um comando. Portanto, se você especificar um comando,
~/.profile
não será lido.O OpenSSH permite definir variáveis de ambiente no lado do servidor. Isso deve estar ativado na configuração do servidor , com a
PermitUserEnvironment
diretiva. As variáveis podem ser definidas no arquivo~/.ssh/environment
. Supondo que você use autenticação de chave pública, também é possível definir variáveis por chave em~/.ssh/authorized_keys
: addenvironment="FOO=bar"
no início da linha relevante.O Ssh também suporta o envio de variáveis de ambiente. No OpenSSH, use a
SendEnv
diretiva em~/.ssh/config
. No entanto, a variável de ambiente específica deve ser ativada com umaAcceptEnv
diretiva na configuração do servidor; portanto, isso pode não funcionar para você.Uma coisa que eu acho que sempre funciona (por incrível que pareça), desde que você esteja usando autenticação de chave pública é (ab) usar a
command=
opção noauthorized_keys
arquivo . Uma chave com umacommand
opção é boa apenas para executar o comando especificado; mas o comando noauthorized_keys
arquivo é executado com a variável de ambienteSSH_ORIGINAL_COMMAND
definida para o comando especificado pelo usuário. Essa variável está vazia se o usuário não especificou um comando e, portanto, esperava um shell interativo. Portanto, você pode usar algo parecido com isso~/.ssh/authorized_keys
(é claro, isso não se aplicará se você não usar essa chave para autenticar):Outra possibilidade é escrever scripts de wrapper no servidor. Algo como o seguinte em
~/bin/ssh-wrapper
:Em seguida, faça links simbólicos para esse script chamado
rsync
,unison
etc. Passe--rsync-path='bin/rsync'
narsync
linha de comando e assim por diante para outros programas. Como alternativa, alguns comandos permitem especificar um snippet de shell inteiro para executar remotamente, o que permite tornar o comando independente: por exemplo, com o rsync, você pode usar--rsync-path='. ~/.profile; rsync'
.Existe outro caminho que depende do seu shell de login ser bash ou zsh. O Bash sempre lê
~/.bashrc
quando é chamado por rshd ou sshd, mesmo que não seja interativo (mas não se for chamado comosh
). Zsh sempre lê~/.zshenv
.fonte
command=
inauthorized_keys
) funciona de forma transparente. Outros requerem um shell ou opções específicas na configuração do servidor ssh. O equivalente mercurial de--rsync-path
é--remotecmd
.command=
de comando como no seu post superuser.com/a/207262/137762Normalmente, após o login, o bash lê comandos de:
~ / .bash_profile
~ / .bashrc
Na página do manual do bash:
fonte
Estou sem tempo para testar isso, mas procurando nas páginas de manual que encontrei:
man bash: quando o bash é iniciado de maneira não interativa, para executar um script de shell, por exemplo, ele procura a variável BASH_ENV no ambiente, expande seu valor se aparecer lá e usa o valor expandido como o nome de um arquivo para leia e execute. O Bash se comporta como se o seguinte comando fosse executado: if [-n "$ BASH_ENV"]; então . "$ BASH_ENV"; fi mas o valor da variável PATH não é usado para procurar o nome do arquivo.
man ssh: ~ / .ssh / environment Contém definições adicionais para variáveis de ambiente; veja AMBIENTE, acima.
A combinação sugere como você pode fazer com que o ssh execute seu .profile
Infelizmente, meu servidor tem PermUserEnvironment com o valor padrão de não, o que faz com que isso não funcione para mim (e, como eu disse, não tenho tempo para brincar mais).
fonte
(removido ... só pode ter um hiperlink como novo usuário ~)
Atualizar
Desculpe, não vi que se trata de uma sessão não interativa, à qual o link acima não se aplica.
Portanto, a questão é: por que não o executa, mesmo que seu shell seja iniciado assim?
Fonte
fonte