Qual é a diferença entre "su --command" e "su --session-command"?

3

A execução de # su - oliver --command bash fornece um shell, mas também imprime o aviso bash: no job control in this shell e, de fato, Ctrl + Z e fg / bg não funcionam nesse shell.

A execução de # su - oliver --session-command bash fornece um shell sem imprimir o aviso, e o controle de tarefas realmente funciona.

A sugestão de usar --session-command vem de Iniciar um shell a partir de scripts usando os resultados do su em " nenhum controle de trabalho neste shell " que afirma" [uma correção de segurança para su] alterou o comportamento da opção -c e desativa o controle de tarefa dentro do shell chamado ".

Mas ainda não entendi bem isso. Quando alguém deve usar --command e quando deve usar --session-command ? O --command (aka -c ) é mais seguro? Ou deve-se sempre usar --session-command , e --command é deixado para compatibilidade com versões anteriores?

FWIW, estou usando o RHEL 6.4.

    
por oliver 30.05.2014 / 13:23

3 respostas

1

Geralmente, você deve preferir --command (-c) a --session-command . Você não deve estar usando -c com shells interativos (talvez você queira --shell /bin/bash ?), Mas você deve usá-lo com processos em segundo plano.

- session-command não chama setsid () para alocar uma nova sessão (que tem o efeito, como você descobriu, de permitir o uso continuado do controle tty e assim o bash lhe dará controle de processo sendo um shell interativo ). Isso significa que seus filhos podem ser atribuídos a qualquer grupo de processos da sessão pai, talvez a sessão foreground pg ou a evitar killpg () ou outra classificação baseada no ID do grupo de processos. Ele também mantém a capacidade de enviar SIGCONT para qualquer processo na sessão, embora eu não tenha certeza de como isso é abusivo.

    
por 31.05.2014 / 01:20
0

Considerando que --session-command não está na página do manual de qualquer grande distribuição de que eu tenha ouvido falar, é provável que seja uma coisa personalizada do RHEL (o Google também não ajudou).

-c torna su executar o comando especificado usando qualquer shell definido em /etc/passwd para o usuário especificado. Isso faz com que seja parecido com sudo , mas como qualquer usuário que você selecione e saiba a senha. -c não fornece um shell interativo, então qualquer coisa que exija um tty não funcionará.

    
por 30.05.2014 / 15:04
0

Também descobri que usar -c não cria um tty:

# su nobody -s /bin/bash -c "echo hi >/dev/tty"
bash: /dev/tty: No such device or address
#
# su nobody -s /bin/bash --session-command="echo hi >/dev/tty"
hi
#
    
por 21.10.2016 / 23:29