Eu tenho a seguinte tarefa:
- o comando deve ser executado como root no servidor remotamente no script bash sobre ssh e a saída do comando deve ser buscada na variável.
- o login via ssh como root está desabilitado.
- sudo no servidor está desabilitado, então tenho que usar su.
- EDIT: como quero torná-lo o mais automatizado possível no bash, a senha deve ser armazenada dentro do comando
Eu pesquisei no Google por dias, mas parece que não consigo encontrar uma solução para isso.
Solução proposta aqui: ssh para servidor e troque de usuário e mude um diretório
ssh -t username@hostname "sudo su - otheruser -c \"cd /path/to/directory && command\""
não funciona porque o sudo está desabilitado no servidor:
Alguém tem uma solução para isso?
Faça login via SSH (como usuário sem privilégios) e execute o comando
su
sem nenhum argumento para mudar para o usuário root. Você precisará da senha de root para fazer isso. Em seguida, execute os comandos que deseja executar.EDIT: Se você quiser fazer isso em uma linha, você pode usar o seguinte:
ssh username@hostname "su -c \"code_here\""
Se isso não funcionar, verifique se a senha do root está habilitada executando
passwd
como root. Isso solicitará uma nova senha de root.Extra: Para executar um comando como outro usuário além do root (observe que isso requer a senha do usuário de destino):
ssh username@hostname "su - username_of_target -c \"code_here\""
Talvez um pouco fora do tópico, mas isso pode ser alcançado com Python e o módulo paramiko :
Deve-se observar que armazenar senhas em script geralmente é uma má ideia do ponto de vista da segurança. Certifique-se de ter as permissões adequadas definidas para o script (por exemplo, chmod 740)
Você também pode usar o comando paramiko invocar shell para sessão interativa. https://www.youtube.com/watch?v=lLKdxIu3-A4
Para um pesadelo de segurança um pouco menor do que colocar a senha do root em um script, você pode usar um
setuid
executável.setuid
executáveis são executados como root, não importa qual usuário os execute.A principal vantagem disso é que, se alguém roubar seu laptop, ele poderá ser executado
smartctl -a /dev/sda
como root, mas, caso contrário, terá apenas seus privilégios de usuário. Ou menos ainda, se você configurar uma chave pública com um comando forçado conforme mencionado mais adiante.Escreva um programa C simples,
smartctl_wrapper.c
, que simplesmente execute o script ou programa que você precisa, assim:E compilá-lo como
gcc smartctl_wrapper.c -o smartctl_wrapper
.Você então faz isso pertencer ao root e ao grupo que deve ser capaz de executá-lo. Esses comandos devem ser executados como root:
Em seguida, torne-o um
setuid
executável. Evite também que qualquer usuário o edite:Este agora é um executável que pode ser executado por qualquer membro
some_group
com permissões de root, sem a necessidade de senha.Agora você pode simplesmente executá-lo com ssh:
Se o servidor permitir, você pode configurar a conexão ssh com uma chave pública para permitir conexões sem senha. Você também pode usar comandos forçados para que essa chave não sirva para nada além de executar esse script.
Se o servidor não permitir, você pode criar um script com a senha do ssh. Nesse caso, eu recomendo que você crie um novo usuário apenas para isso com permissões mínimas e um shell de login de
/sbin/nologin
.Como alternativa, para o seu caso de uso específico, pode fazer mais sentido evitar a execução de comandos como root over
ssh
inteiramente. Você poderia, por exemplo, agendar esse comando para ser executado periodicamente usandocron
. Você pode editar o crontab do root com:e adicionando a linha:
A linha fornecida executará o comando uma vez por semana, 5 minutos após a meia-noite de domingo. Você pode ajustar isso ao seu gosto, seguindo as instruções em crontab(5) .
Então você pode usar
ssh
apenas para ler os logs.Então, depois de 4 horas de rastreamento adicional na web, finalmente consegui! Muito obrigado a @jeroen-it-nerdbox por me dar insights sobre isso:
A tarefa era obter dados do smartctl (que requer credenciais de root), do servidor com ssh-root desativado e sudo desativado. É claro que isso também funcionará com sudo em vez de su.
aqui está o código funcional completo em Python com implementação de Paramiko.
você pode fazer isso simplesmente assim em bash: que simula a interação humana com su. Eu o uso em meus instaladores remotos automáticos para servidores que não possuem sudo.
atenciosamente,