quando o ssh é executado com um argumento server + command, qual o perfil de inicialização executado, se houver algum?

0

Eu sei que /etc/profile e ~/.profile estão entre os scripts de inicialização usados quando ssh é usado para efetuar login em um servidor - i. e. usando ssh com o argumento do servidor. No entanto, o cenário em que estou apenas usando ssh com um argumento de comando do servidor + parece não ter os mesmos scripts de inicialização.

Suponha que eu tenha o bash como shell padrão. Se .bashrc existir, eu sei que é captado neste cenário. Mas se .bashrc não existir e nenhum outro perfil pessoal existir, o que mais é executado?

Existe outro script global que fornece as variáveis de ambiente?

    
por user55570 07.04.2015 / 02:34

2 respostas

1

Esta página tem mais do que você provavelmente deseja saber, mas é um ótimo recurso conciso:

Basicamente, quando você faz um ssh em um computador, você não está executando um shell de 'login', então arquivos diferentes são originados. Em suma, se o seu shell padrão for / bin / bash (padrão no Ubuntu), você estará obtendo um ~/.bashrc em seu diretório inicial. Verifique a seção FILES da página man bash ( man bash ), perto do final, para outros arquivos que entram em ação.

Além disso, certifique-se de estar atento ao .bashrc das linhas que saem, se não estiverem usando um shell 'interativo'. Uma boa maneira de descobrir isso é colocar impressões no seu .bashrc e continuar experimentando até você descobrir.

Assim:

# ~/.bashrc:

echo "HERE I WAS!"

# Exit here unless an interactive session.
[ -z "$PS1" ] && return

echo "HERE I AM!"
    
por dpb 07.04.2015 / 03:28
1

Sem um comando, o SSH executa um shell de login. Para bash , isso envolve o fornecimento de .profile (que, no Ubuntu, origina .bashrc ) (e /etc/profile , que origina /etc/bash.bashrc ). Existem outros arquivos que podem ser originados, como .bash_profile , mas uma configuração padrão do Ubuntu possui apenas .profile .

$ grep bashrc /etc/profile .profile
/etc/profile:    # The file bash.bashrc already sets the default PS1.
/etc/profile:    if [ -f /etc/bash.bashrc ]; then
/etc/profile:      . /etc/bash.bashrc
.profile:    # include .bashrc if it exists
.profile:    if [ -f "$HOME/.bashrc" ]; then
.profile:   . "$HOME/.bashrc

Quando executado com um comando, o SSH não executa um shell de login, portanto, de acordo com man bash ( seção INVOCATION ):

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.  This may be inhibited by using the  --norc  option.
The  --rcfile  file option will force bash to read and execute commands
from file instead of /etc/bash.bashrc and ~/.bashrc.

No entanto, com um comando, bash não está sendo executado de forma interativa. Então, por que .bashrc é originado? Novamente, de man bash :

Bash attempts to determine when it is being run with its standard input
connected to a network connection, as when executed 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 and ~/.bashrc, if these  files  exist  and  are
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 neither rshd nor sshd generally
invoke the shell with those options or allow them to be specified.

Outros arquivos podem ser lidos pelo SSH (de man ssh , seção FILES ):

~/.ssh/rc
     Commands in this file are executed by ssh when the user logs in,
     just before the user's shell (or command) is started.  See the
     sshd(8) manual page for more information.
/etc/ssh/sshrc
     Commands in this file are executed by ssh when the user logs in,
     just before the user's shell (or command) is started.  See the
     sshd(8) manual page for more information.

Para variáveis de ambiente, (de man ssh , seção ENVIRONMENT ):

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).

O módulo pam_env está habilitado para SSH:

$ grep pam_env /etc/pam.d/sshd 
# /etc/security/pam_env.conf.
session    required     pam_env.so # [1]
session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale

Portanto, as variáveis em /etc/environment e ~/.pam_environment também são definidas (e /etc/default/locale , pois envfile está definido). No entanto, esses arquivos não são originados da forma como .profile é, portanto, você não pode usar comandos shell aqui.

    
por muru 07.04.2015 / 04:11