Estou automatizando um processo de implantação e quero chamar apenas um arquivo .sh na minha máquina, fazer minha compilação e fazer upload do arquivo .zip no servidor e fazer várias coisas no servidor. Uma das coisas que preciso fazer exige que eu seja raiz. Então, o que eu quero fazer é o seguinte:
ssh user@172.1.1.101 <<END_SCRIPT
su -
#password... somehow...
#stop jboss
service server_instance stop
#a bunch of stuff here
#all done!
exit
END_SCRIPT
Isso é possível?
Respostas:
Você já considerou um sudo sem senha?
fonte
Em vez de su, use sudo com o NOPASSWD configurado em sudoers para o (s) comando (s) apropriado (s). Você deseja tornar o comando permitido definido o mais limitado possível. Tê-lo chamado para executar um script para os comandos root pode ser a maneira mais limpa e mais fácil de proteger, se você não estiver familiarizado com a sintaxe do arquivo sudoer. Para comandos / scripts que exigem o carregamento de todo o ambiente,
sudo su - -c command
funciona embora possa ser um exagero.fonte
O que você está descrevendo pode ser possível com o expect .
fonte
Você pode passar um comando como argumento para o SSH para executar esse comando no servidor e sair:
Isso também funciona para uma lista de vários comandos:
Ou alternativamente:
Como outros usuários indicaram antes de mim, a execução
su
no servidor iniciará um novo shell em vez de executar comandos subseqüentes no script como root. O que você precisa fazer é usar umsudo
ousu -c
, e forçar a alocação de TTY ao SSH com a-t
opção (necessário se você precisar digitar a senha root):Para resumir tudo, uma maneira de realizar o que você deseja fazer seria:
Como
sudo
normalmente lembra o nível de autorização por alguns minutos antes de solicitar a senha root novamente, basta anexarsudo
todos os comandos que você precisa executar como root e provavelmente a maneira mais fácil de executar comandos como root no servidor. A adição de umaNOPASSWD
regra para o usuário/etc/sudoers
tornaria o processo ainda mais suave.Eu espero que isso ajude :-)
fonte
NOPASSWD
regra, verifique os exemplos na parte inferior deman sudoers
. Além disso, lembre-se de usarvisudo
ao editar seusudoers
arquivo para evitar quebras!su -c
vez desudo
, deverá executar o SSH com o-t
sinalizador - será solicitada a senha root no servidor quando o comando for executado. Fornecer uma senha diretamente asu
como um argumento de linha de comando não é nem suportada (até onde eu sei), nem recomendado - desde um simplesps -ef | grep su
revela todos os argumentos passados parasu
, incluindo qualquer senha fornecida a partir da linha de comando ...su -c
por SSH:ssh -t user@host 'su -lc "
<br />echo this is a test
<br />echo this is another test
<br />"
<br />'
<br />
acima por novas linhas em seu script. Off-topic: Você pode adicionar novas linhas aos comentários do ServerFault? Isso seria bastante útil ao postar trechos de código ...Não. Mesmo se você receber a senha
su
, ainda precisará lidar com o fato desu
abrir um novo shell, o que significa que seus outros comandos não serão transmitidos a ele. Você precisará escrever um script para as operações raiz, juntamente com um executável auxiliar que possa invocá-lo com os privilégios apropriados.fonte
Escreva um script esperado. Sei que você já encontrou uma resposta para isso, mas isso pode ser útil se você precisar fazer login em vários servidores que exigem entrada de senha interativa.
É uma linguagem baseada no TCL, por isso pode ser um pouco estranho em comparação com scripts shell simples e antigos. Mas ele lida com a automação da entrada de texto e, você adivinhou, "espera" certos bits de saída antes de inserir qualquer tipo de entrada automatizada de senha ou aumento de privilégios.
Aqui está um bom link como guia: http://bash.cyberciti.biz/security/expect-ssh-login-script/
Apenas no caso de o site cair:
fonte
Eu sei que isso é um pouco tarde, mas eu pessoalmente usaria o Net :: SSH :: Expect, disponível no CPAN.
http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod
fonte
Você pode usar 'ssh example.com su -lc "$ cmd"'.
Quando o comando contém opções, é necessário citá-lo, caso contrário "su" pode comê-las ("su: opção inválida - 'A').
fonte