Você já considerou um sudo sem senha?
Estou automatizando um processo de implantação e quero poder apenas chamar um arquivo .sh em minha máquina, fazer com que ele compile e carregue o arquivo .zip no servidor e, em seguida, faça um monte de coisas no servidor . Uma das coisas que preciso fazer requer que eu seja o root. Então, o que eu quero fazer é isto:
ssh [email protected] <<END_SCRIPT
su -
#password... somehow...
#stop jboss
service server_instance stop
#a bunch of stuff here
#all done!
exit
END_SCRIPT
Isso é possível?
Em vez de su, use sudo com o NOPASSWD configurado em sudoers para o (s) comando (s) apropriado (s). Você desejará tornar o conjunto de comandos permitido o mais limitado possível. Chamar a execução de um script para os comandos root pode ser a maneira mais limpa e, de longe, a mais fácil de ser feita se você não estiver familiarizado com a sintaxe do arquivo sudoer. Para comandos / scripts que exigem que o ambiente completo seja carregado, sudo su - -c command
funciona, embora possa ser um exagero.
O que você está descrevendo pode ser possível com expectativa .
Você pode passar um comando como um argumento para o SSH para executar esse comando no servidor e, em seguida, sair:
ssh user@host "command to run"
Isso também funciona para uma lista de vários comandos:
ssh user@host "command1; command2; command3"
Ou alternativamente:
ssh user@host "
command1
command2
command3
"
Como outros usuários apontaram antes de mim, executar su
no servidor iniciará um novo shell em vez de executar comandos subseqüentes no script como raiz. O que você precisa fazer é usar sudo
ou su -c
e forçar a alocação de TTY para SSH com a opção -t
(necessária se você precisar inserir a senha de root):
ssh -t user@host 'su - -c "command"'
ssh -t user@host 'sudo command'
Para resumir tudo, uma forma de realizar o que você deseja fazer seria:
#!/bin/bash
ssh -t [email protected] "
sudo some_command
sudo service server_instance stop
sudo some_other_command
"
Como sudo
normalmente lembra seu nível de autorização por alguns minutos antes de solicitar a senha raiz novamente, apenas prefixar sudo
em todos os comandos que você precisa executar como root é provavelmente a maneira mais fácil de executar comandos como root no servidor. Adicionar uma regra NOPASSWD
para seu usuário em /etc/sudoers
tornaria o processo ainda mais fácil.
Espero que isso ajude: -)
Não. Mesmo se você obtiver a senha para su
, ainda terá que lidar com o fato de que su
abrirá um novo shell, o que significa que seus comandos adicionais não serão passados para ele. Você precisará escrever um script para as operações raiz junto com um executável auxiliar que possa invocá-lo com os privilégios apropriados.
Escreva um script de expectativa. Eu sei que você já encontrou uma resposta para isso, mas isso pode ser útil se você tiver que entrar em um grupo de servidores que exigem entrada de senha interativa.
É uma linguagem baseada em TCL, então pode ser um pouco estranho em comparação com scripts de shell simples. Mas ele lida com a automação de entrada de texto e, você adivinhou, "espera" certos bits de saída antes de entrar em qualquer tipo de entrada de senha automatizada ou escalação de privilégios.
Aqui está um bom link como guia: link
Apenas no caso de o site ficar inativo:
#!/usr/bin/expect -f
# Expect script to supply root/admin password for remote ssh server
# and execute command.
# This script needs three argument to(s) connect to remote server:
# password = Password of remote UNIX server, for root user.
# ipaddr = IP Addreess of remote UNIX server, no hostname
# scriptname = Path to remote script which will execute on remote server
# For example:
# ./sshlogin.exp password 192.168.1.11 who
# ------------------------------------------------------------------------
# Copyright (c) 2004 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
# set Variables
set password [lrange $argv 0 0]
set ipaddr [lrange $argv 1 1]
set scriptname [lrange $argv 2 2]
set arg1 [lrange $argv 3 3]
set timeout -1
# now connect to remote UNIX box (ipaddr) with given script to execute
spawn ssh root@$ipaddr $scriptname $arg1
match_max 100000
# Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof
Eu sei que isso é um pouco tarde, mas eu pessoalmente usaria o Net :: SSH :: Expect, disponível no CPAN.
Você pode usar 'ssh example.com su -lc "$ cmd"'.
Quando o comando contém opções, você precisa citá-lo, caso contrário, "su" pode comê-las ("su: opção inválida - 'A').
ssh -AX -tt example.com 'su -lc "tmux new-session -A"'