usando su dentro de um script de shell

12

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?

    
por cmcculloh 15.07.2010 / 01:51

8 respostas

15

Você já considerou um sudo sem senha?

    
por 15.07.2010 / 05:03
5

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.

    
por 15.07.2010 / 05:24
3

O que você está descrevendo pode ser possível com expectativa .

    
por 15.07.2010 / 02:25
3

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

    
por 15.07.2010 / 12:55
2

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.

    
por 15.07.2010 / 02:19
1

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
    
por 16.07.2010 / 05:50
1

Eu sei que isso é um pouco tarde, mas eu pessoalmente usaria o Net :: SSH :: Expect, disponível no CPAN.

link

    
por 09.11.2010 / 05:15
0

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"'
    
por 10.12.2013 / 23:03

Tags