Fonte .profile e .bashrc no login ssh sem tty -- ssh camp apple Relacionado O problema

Source .profile and .bashrc on ssh login without tty


4
vote

problema

português

Como faço para verifiqueções ssh .profile e .bashrc no login sem tty?

Eu tenho um Mac (10.6.8) que estou usando para várias tarefas UNIX-Y como hospedar repositórios Git. Eu tenho login remoto habilitado através do painel de "compartilhamento" de preferências do sistema. Quando eu ssh na máquina, bash fontes ~/.profile , que eu configurei para a origem Meu ~/.bashrc arquivo e Configure meu Macports caminho. O problema é que quando eu executo ssh sem um tty , assim:

  ssh myhost echo $PATH    

ou executar um comando git que usa essencialmente .bashrc0 da mesma maneira:

  .bashrc1   

meu abcdefghijklmn.bashrc2 o meu abcdefghijklmn13 variável está faltando .bashrc4 (onde o Macports instalou .bashrc5 ).>). Estou ciente de que:

  • eu posso configurar .bashrc6 na minha máquina local para usar .bashrc7 na minha máquina remota
  • eu não teria esse problema se eu estivesse forçando um .bashrc8 com .bashrc9

Mas eu não quero fazer nenhum desses. Eu quero que minha máquina remota seja fonte Meu ABCDEFGHIJKLMNABCDEFGHIJKLMN20 Arquivo independentemente de eu estou ou não login em W / A TTY.

Como faço esse sonho uma realidade?

Eu também verifiquei o comportamento em algumas máquinas Linux (Debian e Fedora), e ambos os sistemas parecem fornecer o arquivo ssh1 no login, independentemente de ser um abcdefghijklmn22 . Eu estava sob a impressão de que BSD e Linux usam o mesmo openssh e bash implementações, por isso parece que a diferença de comportamento pode vir de diferenças em ABCDEFGHIJKLMNABCDEFGHIJKLMN23 Arquivos de configuração?

english

How do I make sure ssh sources .profile and .bashrc on login without tty?

I have a Mac (10.6.8) that I'm using for various UNIX-y tasks like hosting git repositories. I have remote login enabled via the System Preferences "Sharing" pane. When I ssh into the machine, bash sources ~/.profile, which I have set up to source my ~/.bashrc file and set up my MacPorts path. The problem is that when I run ssh without a tty, like this:

ssh myhost echo \$PATH 

Or run a git command that essentially uses ssh in the same way:

git clone ssh://myhost/~/code/myrepo.git 

My ~/.profile file is never sourced, so my $PATH variable is missing /opt/local (where MacPorts has installed git). I am aware that:

  • I can configure git on my local machine to use /opt/local/bin/git-* on my remote machine
  • I wouldn't have this problem if I was forcing a tty with ssh -t

But I don't want to do either of those. I want my remote machine to source my ~/.profile file regardless of whether or not I'm logging in w/ a tty.

How do I make that dream a reality?

Also: I checked the behavior on a couple Linux machines (Debian and Fedora), and both systems seem to source the ~/.bashrc file on login regardless of whether it is a tty. I was under the impression that BSD and Linux both use the same OpenSSH and bash implementations, so it seems like the difference in behavior might come from differences in /etc config files?

  

Lista de respostas

4
 
vote
vote
Melhor resposta
 

Bash tem provisões especiais em seu código-fonte para origem ~/.bashrc quando estiver chamado por rshd ou sshd . É uma opção de compilação, que, dada que sua experiência parece não ser ativada sob OSX.

Se você estiver fazendo login com uma chave, você pode (AB) usar o command= opção no ABCDEFGHIJKLMNABCDEFGHIJKLMN4 Arquivo. Uma tecla ABCDEFGHIJKLMNABCDEFGHIJKLMN5 é boa apenas para executar o comando especificado; Mas o comando no arquivo abcdefghgjklmnabcdefghijklmn6 é executado com a variável de ambiente SSH_ORIGINAL_COMMAND Defina para o comando o usuário especificado (vazio para sessões interativas). Para que você possa usar algo assim em ~/.ssh/authorized_keys (claro, não será aplicado se você não usar essa chave para autenticar):

  command=". ~/.profile;          if [ -n "$SSH_ORIGINAL_COMMAND" ]; then            eval "$SSH_ORIGINAL_COMMAND";          else exec "$SHELL"; fi" ssh-rsa …    

Observe que eu coloco quebras de linha acima por legibilidade, mas isso realmente precisa estar tudo em uma linha.

Como posso Definir variáveis ​​de ambiente para um processo RSYNC remoto? Pode ter outras sugestões úteis.

 

Bash has special provisions in its source code to source ~/.bashrc when it's invoked by rshd or sshd. It's a compilation option, which given your experience seems not to be turned on under OSX.

If you're logging in with a key, you can (ab)use the command= option in the ~/.ssh/authorized_keys file. A key with a command option is good only for running the specified command; but the command in the authorized_keys file runs with the environment variable SSH_ORIGINAL_COMMAND set to the command the user specified (empty for interactive sessions). So you can use something like this in ~/.ssh/authorized_keys (of course, it won't apply if you don't use this key to authenticate):

command=". ~/.profile;          if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then            eval \"$SSH_ORIGINAL_COMMAND\";          else exec \"$SHELL\"; fi" ssh-rsa xe2x80xa6 

Note that I put line breaks above for legibility, but this actually needs to be all on one line.

How can I set environment variables for a remote rsync process? may have other helpful suggestions.

 
 
       
       
7
 
vote

Aqui está um método para ter uma fonte de bash .bashrc em sessões não interativas para que você não precise variáveis ​​de ambiente de código duro em vários locais:

    .
  1. set rshd0 para rshd1 em rshd2 ( Man sshd )
  2. set rshd3 para rshd4 em rshd5 ( Man Bash )
  3. Adicione esta linha ao topo do seu rshd6 , quais fontes rshd7 para sessões não interativas:

Isso essencialmente duplica o ambiente de login interativo para logins não interativos, sem ter de valores de ambiente de código duro (por exemplo, $ caminho) em vários locais.

  rshd8   

Etapa 3. Somente é necessário se você tiver o (s) Caminho (s) Macports, definido (s) em rshd9 como eu faço. Mas se você estiver definindo esses caminhos (por exemplo, sshd0 ) em sshd1 , então suponho que você não precisaria de Etapa 3.

Para sua situação, você deve ser capaz de alterar sshd2 para sshd3 .

Eu tenho sshd4 fonte sshd5 e eu não uso sshd6 . Com esta configuração (e as alterações acima), as variáveis ​​de ambiente bash (por exemplo, sshd7 ) devem parecer idênticas para login interativo, não login interativo e sessões não interativas.

 

Here's a method to have bash source .bashrc on non-interactive sessions so that you don't have to hard code environment variables in multiple places:

  1. Set PermitUserEnvironment to yes in /etc/sshd_config (man sshd)
  2. Set BASH_ENV to ~/.bashrc in ~/.ssh/environment (man bash)
  3. Add this line to the top of your ~/.bashrc, which sources /etc/profile for non-interactive sessions:

This essentially duplicates the interactive login environment for non-interactive logins, without having to hard code environment values (e.g., $PATH) in multiple places.

if [[ ! $- == *i* ]]; then         . /etc/profile fi 

Step 3. is needed only if you have the Macports path(s) set in /etc/paths like I do. But if you're setting those paths (e.g., /opt/local/bin) in ~/.bashrc, then I suppose you wouldn't need Step 3.

For your situation, you should be able to change ~/.bashrc to ~/.profile.

I have ~/.bash_profile source ~/.bashrc, and I do not use ~/.profile. With this configuration (and the above changes), bash environment variables (e.g., $PATH) should look identical for interactive login, interactive non-login, and non-interactive sessions.

 
 
     
     
3
 
vote

Isso foi muito chato. Descomente esta linha no Config-top.h e reconstrua:

/ * Defina isso se você quiser que Bash tente verificar se ele está sendo executado por sshd e fonte o .bashrc se assim for (como o comportamento RSHD). Isso verifica para a presença de ssh_client ou ssh2_client no ambiente inicial, que pode ser enganado sob certas circunstâncias não-incomuns. * /

Definir ssh_source_bashrc

De acordo com as alterações na origem, esse comportamento foi alterado em Bash-2.05A-RC1. Mas a página atual atual ainda reivindica o comportamento anterior:

     Bash attempts to determine when it is being run with its standard input    connected  to a a network connection, as if by the remote shell daemon,    usually rshd, or the secure shell daemon sshd.  If bash  determines  it    is  being  run  in  this  fashion,  it reads and executes commands from    ~/.bashrc, if that file exists and is readable.  It will not do this if    invoked as sh.  The --norc option may be used to inhibit this behavior,    and the --rcfile option may be used to force another file to  be  read,    but  rshd  does  not  generally  invoke the shell with those options or    allow them to be specified.    
 

this was very annoying. uncomment this line in config-top.h and rebuild:

/* Define this if you want bash to try to check whether it's being run by sshd and source the .bashrc if so (like the rshd behavior). This checks for the presence of SSH_CLIENT or SSH2_CLIENT in the initial environment, which can be fooled under certain not-uncommon circumstances. */

define SSH_SOURCE_BASHRC

according the CHANGES in the source this behavior was changed in bash-2.05a-rc1. but the current man page still claims the previous behavior:

   Bash attempts to determine when it is being run with its standard input    connected  to a a network connection, as if by the remote shell daemon,    usually rshd, or the secure shell daemon sshd.  If bash  determines  it    is  being  run  in  this  fashion,  it reads and executes commands from    ~/.bashrc, if that file exists and is readable.  It will not do this if    invoked as sh.  The --norc option may be used to inhibit this behavior,    and the --rcfile option may be used to force another file to  be  read,    but  rshd  does  not  generally  invoke the shell with those options or    allow them to be specified. 
 
 

Perguntas relacionadas

2  Como se livrar de todos os .serverauth. $$ no diretório inicial no OS X?  ( How to get rid of all the serverauth in the home directory on os x ) 
Como evitar o Gettin Muito de .serverauth.$$ arquivos no diretório inicial no OS X 10.8? ($$ é um número pid). ...

11  Microsoft Remote Desktop através da porta encaminhada do SSH  ( Microsoft remote desktop through ssh forwarded port ) 
Eu tenho uma situação em que eu forneço acesso a um servidor Windows encaminhando a porta de desktop remota 3389 com SSH do Mac para o "interno" de uma rede i...

1  Desativar dispositivo de rede por período de tempo especificado  ( Disable network device for specified period of time ) 
Recentemente, convertei um antigo MacBook em um servidor, executando o OS X 10.6.8 (a edição normal e não-servidor). Eu uso como meu servidor VPN, meu servido...

2  GRC dentro do terminal (com cores diferentes no terminal em função do tamanho dos arquivos) não funciona em 10.14.6 Mojave e trabalhando em alta Sierra 10.13.6  ( Grc inside terminal with different colors into terminal as a function of files ) 
Eu posso trabalhar a ferramenta grc , que permite ter cores para permissões e cores diferentes como uma função do tamanho dos arquivos listados, por exemplo,...

105  O que é um bom utilitário gráfico SFTP para OS X?  ( Whats a good graphical sftp utility for os x ) 
Eu preciso de um pequeno utilitário gráfico, usando o que posso ssh para um servidor e ver todos os arquivos e copiar e colar (arrastar e soltar) na minha máq...

1  Acessando Nokia N900 SSH via USB [FECHADO]  ( Accessing nokia n900 ssh via usb ) 
. FECHADO. Esta questão é off-tópico . Atualmente não está aceitando respostas. Quer melh...

2  Terminal: Existe uma maneira de ser notificado de atividade ao responder um log de erros  ( Terminal is there a way to be notified of activity when tailing an error log ) 
Eu frequentemente ssh em uma máquina e cauda -f é log de erros php. Minha situação ideal seria deixar essa janela terminal aberta em segundo plano, mas quando...

4  Montando um SCP remoto ou compartilhamento SFTP no Mac  ( Mounting a remote scp or sftp share on mac ) 
Eu uso fuse4x e empilhadeira para montar um diretório remoto (um servidor dev). Eu uso o PHPSTORM para abrir projetos e fonte ( /Volumes/dev/project_path ), m...

1  Posso evitar que um remoto Mac digite o sono através de uma conexão SSH remota?  ( Can i prevent a remote mac from entering sleep via a remote ssh connection ) 
Desde que eu atualizei para o leão da montanha, tenho a sensação de que meu Mac (início de 2008 iMac) vai dormir aleatoriamente quando estou conectado pelo SS...

0  Web e saída SSH parou de funcionar, mas ping e outros serviços de rede funcionam  ( Web and outbound ssh stopped working but ping and other network services work ) 
Nosso imac em casa funcionando 10.6 de repente parou de carregar páginas da Web. Também ao tentar fazer um login seguro para outro host no terminal.app, ele f...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.