(svn + ssh) recebendo o bash para carregar meu PATH sobre SSH

6

Este problema surge comigo tentando tornar o svnserve (servidor Subversion) disponível em um servidor através do SSH. Eu compilei o SVN e instalei-o em $HOME/bin . O acesso local a ele (não através do SSH) funciona bem.

As conexões para svn+ssh falham devido a:

bash: svnserve: command not found

Depurando isso, descobri que:

ssh user@server "which svnserve"

diz:

which: no svnserve in (/usr/bin:/bin)

Isso é estranho, porque atualizei o caminho para $HOME/bin no meu .bashrc e também o adicionei em ~/.ssh/environment . No entanto, parece que o SSH não o lê. Embora quando eu corro:

ssh user@server "echo $PATH"

faz imprimir meu caminho atualizado!

O que está acontecendo aqui? Como posso fazer o SSH encontrar meu svnserve ? Agradecemos antecipadamente

    
por Eli Bendersky 09.04.2010 / 09:32

6 respostas

4

Você pode tentar iniciar o comando através de um bash usando o comando -l para que ele funcione como um shell de login

ssh user@server "bash -l -c 'which svnserve'"

Como observado nos comentários que deixei acima, você precisará escapar de todos os $, para que as variáveis sejam expandidas no servidor e não localmente. Por exemplo:

ssh user@server "bash -l -c 'echo \$PATH'"

update:

Em relação à sua pergunta sobre por que o .ssh / environment não entra em vigor, acredito que a configuração padrão do SSHd seria ignorar os ambientes do usuário. Você precisa ativá-lo especificamente em / etc / ssh / sshd_config (ou similar) e adicionar:

PermitUserEnvironment yes

atualização 2:

Se você não tem acesso ao / etc / ssh / sshd_config, uma solução possível (mas não ideal) seria usar autenticação de chave pública para iniciar o svnserve no login.

Veja link

Observe que isso afetará sua capacidade de fazer login normalmente via SSH. Para fazer isso, você precisa ignorar a autenticação da chave pública:

svn -o PubkeyAuthentication=no user@server
    
por 09.04.2010 / 10:51
3

Por acaso, .bashrc e .bash_profile são executados somente se você estiver em um shell interativo. Quando você faz login através do ssh, você não está em um shell interativo, portanto, suas definições PATH personalizadas nunca são executadas. Você pode associar um script a sheels não interativos usando BASH_ENV . Verifique também .ssh/environment , que oferece outra alternativa. A melhor maneira de saber isso é fazendo man ssh .

Boa sorte!

    
por 09.04.2010 / 09:58
1

Você pode executar um comando env:

ssh servername "env PATH=$REMOTEPATH which svnserve"
    
por 09.04.2010 / 11:01
1

Eu tenho o mesmo problema com o HostMonster, devido a uma alteração recente que eles fizeram. Eu encontrei um workraound em um antigo segmento de e-mail no link :

Na sua estação de trabalho:

  • edite ~/.subversion/config : localize [túneis] e adicione a linha ssh = ~ / svnssh
  • crie ~ / svnssh como no link:

    #!/bin/sh e /usr/bin/ssh $1 /<ur_bluhost_home_path>/sshsvnserve -t

  • chmod +x ~/svnssh

Na sua conta bleuhost:

  • crie ~/sshsvnserve , mesmo conteúdo do link:

    #!/bin/sh e /<ur_bluehost_home_path>/bin/svnserve $*

  • chmod +x ~/sshsvnserve

É isso. A alteração config [tunnels] modifica o comando executado pelo svn ao manipular o namespace svn + ssh e usa o script ur ~ / svnssh. O script chama ssh e passa o caminho completo para sshsvnserve na sua conta bluehost. E o sshsvnserve redireciona tudo para o caminho completo do svnserve, como você o instala. Trabalhei para mim, não é necessário $ PATH.

    
por 13.04.2010 / 09:18
0

Defina a variável BASH_ENV para '~/.bashrc' .

ssh servername "BASH_ENV='~/.bashrc' which svnserve"

De man bash :

When bash is invoked as an interactive login shell, or as a non-inter‐ active shell with the --login option, it first reads and executes com‐ mands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

e

When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist.

e

When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute.

De man ssh :

Additionally, ssh reads ~/.ssh/environment, and adds lines of the format “VARNAME=value” to the environment if the file exists and users are allowed to change their environment. For more information, see the PermitUserEnvironment option in sshd_config(5).

De man sshd_config :

PermitUserEnvironment
Specifies whether ~/.ssh/environment and environment= options in ~/.ssh/authorized_keys are processed by sshd(8). The default is “no”. Enabling environment processing may enable users to bypass access restrictions in some configurations using mechanisms such as LD_PRELOAD.

    
por 09.04.2010 / 12:52
0

Consegui que o ssh executasse comandos usando o caminho remoto executando:

ssh dist@d6 "bash --login -c 'env'"

Isto carrega o arquivo .profile remoto, etc. Aqui env pode ser substituído pelo comando que você quiser.

Eu autorizei chaves, então não precisei de uma senha para executar o comando ou ssh.

    
por 26.04.2012 / 17:37

Tags