LINUX.ORG.RU
ФорумAdmin

Sudo без пароля Centos 6


0

1

Доброго времени суток.

Помогите разобраться запуском скрипта sh без пароля....

1) Создал нового пользователя steam

2) в sudoers добавил правило (перепробывал кучу) вот что в sudoers

steam ALL=(ALL) ALL
steam ALL=(steam) NOPASSWD:/home/servers/*
steam ALL=(steam) NOPASSWD:/home/servers/server.sh
steam ALL = NOPASSWD: /home/servers/server.sh
steam ALL = NOPASSWD: /home/servers/steamcmd.sh

Вот вывод sudo -l от пользователя steam

[steam@gameap ~]$ sudo -l
Matching Defaults entries for steam on this host:
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION
LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY VESTA", !syslog

User steam may run the following commands on this host:
(ALL) ALL
(steam) NOPASSWD: /home/servers/*
(steam) NOPASSWD: /home/servers/server
(root) NOPASSWD: /home/servers/server.sh
(root) NOPASSWD: /home/servers/steamcmd.sh
Но при попытке запустить сервер с консоли один фиг просит пароль...

[steam@gameap servers]$ su steam -c ./server.sh start

Пароль:

Может кто нибудь сталкивался подскажите куда копать.... не пойму... (((

Заранее огромное спаисбо.

su steam -c ./server.sh start

sudo ./server.sh start?

+ если будешь делать скриптом, который не имеет tty (например cron или из веба дергается) учти что нужно закоментить всякие

Defaults    requiretty

fura13 ★★★ ()
Ответ на: комментарий от fura13

Дак вроде закоментировал... вот весь sudoers

[root@gameap servers]# cat /etc/sudoers
# Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the 'visudo' command.

## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhap using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem


## Command Aliases
## These are groups of related commands...

## Networking
#Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
#Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

## Services
#Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

## Updating the locate database
#Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
#Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Delegating permissions
#Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

## Processes
#Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers
#Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults    requiretty

Defaults    env_reset
Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY VESTA"


# Disable syslog loggging
Defaults !syslog

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
steam   ALL=(ALL)       ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel        ALL=(ALL)       ALL

## Same thing without a password
%wheel        ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

# Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
admin   ALL=NOPASSWD:/usr/local/vesta/bin/*
#admin   ALL=NOPASSWD:/home/servers/SteamCMD/*
#finalls        ALL=NOPASSWD:/home/servers/*
#steam  ALL=(steam)     NOPASSWD:/home/servers/*
#steam  ALL=(steam)     NOPASSWD:/home/servers/server.sh
steam ALL=(steam) NOPASSWD: /bin/sh /home/servers/server.sh
steam ALL = NOPASSWD: /home/servers/steamcmd.sh

[root@gameap servers]#

Finalls ()
Ответ на: комментарий от Finalls

Правильно так:

steam ALL=(ALL) NOPASSWD: /home/servers/server.sh
Обрати внимание что запускать надо через sudo (первая часть моего первого коммента)

fura13 ★★★ ()
Ответ на: комментарий от fura13

Правильно так:

steam ALL=(ALL) NOPASSWD: /home/servers/server.sh

неправильно. Вместо ALL нужно поставить имя хоста, а вместо (ALL) пользователя(не рута). Ну и запретить параметры у скрипта, если они не нужны.

emulek ()
Ответ на: комментарий от emulek

так ругается на синтаксис.... А скрипт всё же с вебсервера дернуть не получается... вот что в логах httpd

sudo: no tty present and no askpass program specified

httpd запускается от пользователя apache

воотвественно в sudoers есть вот такая запись

apache ALL = NOPASSWD: /home/servers/server.sh

Не помогает :(

Finalls ()
Ответ на: комментарий от Finalls

так ругается на синтаксис..

как «так»?

sudo: no tty present and no askpass program specified

ну. На сервере не настроен терминал и нет программы для того, что-бы пароль спросить (да и одмин наверное пьяный валяется в углу).

воотвественно в sudoers есть вот такая запись

apache ALL = NOPASSWD: /home/servers/server.sh

ошибка в синтаксисе. Нет поля после «=», ОТ КОГО запускать? потому она NOPASSWD: не видит.

PS: прочти ман наконец. Там всего пять полей.

emulek ()
Ответ на: комментарий от emulek

1) Уже тупил вчера, нормально не ругается, но под пользователем который указан просит пароль.

2) Там по сути скрипт который запускается через веб... (на счет терминала хз поделись ссылочкой где можно почитать...

3) Как ни странно но когда указываеш пользователя просит пароль всё равно при выполнении sudo ./server.sh А когда так как есть всё хорошо....

4) Прочитал разобрался.... под юзером апача скрипт запускается через sudo без пароля.... Но с веба почемуто не хочет пишет sudo: no tty present and no askpass program specified

Собственно эту задачу и нужно счас решить.. Если не сложно подскажите как или ткните где можно почитать... всё что нагуглил связано с sudoers.

Finalls ()
Ответ на: комментарий от Finalls

Как ни странно но когда указываеш пользователя просит пароль всё равно при выполнении sudo ./server.sh А когда так как есть всё хорошо....

ага. «хорошо».

пишет sudo: no tty present and no askpass program specified

это она пароль просит.

Делай нормально. Сколько можно повторять?

например:

А Б = (В) NOPASSWD: Г

запускать команду Г может юзер А через «sudo Г», без пароля, с хоста Б, при этом Г будет запущено с правами юзера В.

Hint: юзай visudo, она синтаксис проверяет.

emulek ()
Ответ на: комментарий от emulek

Доброго времени суток,

Вот sudoers

# Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
admin   ALL=NOPASSWD:/usr/local/vesta/bin/*
apache localhost=(apache) NOPASSWD:/home/servers/server.sh
nginx localhost=(nginx) NOPASSWD:/home/servers/server.sh

Первое правило автоматом прописалось при установки vestacp.

А вот попытка под юзером апач запустить скрипт....

[root@gameap finalls]# sudo -s -u apache
bash-4.1$ sudo ./server.sh
[sudo] password for apache:

Finalls ()
Ответ на: комментарий от Finalls

Если меняю на

apache gameap=NOPASSWD:/home/servers/server.sh
nginx gameap=NOPASSWD:/home/servers/server.sh

то вот выхлоп...

[root@gameap finalls]# sudo -s -u apache
bash-4.1$ cd /home/servers/
bash-4.1$ sudo ./server.sh
Usage all parameters
bash-4.1$

Запускается... ок. передаю строку запуска как передаёт её веб...

bash-4.1$ sudo ./server.sh start /home/servers/test-server cstrike_Cl91Dj_27015 "./hlds_run -console -game cstrike +ip 10.0.0.29 +port 27015 +map de_dust2"
[sudo] password for apache:

Finalls ()
Ответ на: комментарий от Finalls

1. пиши полный путь к скрипту. (а НЕ sudo ./server.sh)

2. сделай скрипт-обёртку, и запускай её апачем. А уже внутри обёртки используй sudo.

3. apache gameap=NOPASSWD:/home/servers/server.sh

это хрень неправильная. Даже если сегодня она работает, то завтра сломается.

emulek ()
Ответ на: комментарий от emulek

Добился того что скрипт начал запускаться...

bash-4.1$ sudo ./server.sh start /home/servers/test-server cstrike_Cl91Dj_27015 "./hlds_run -console -game cstrike +ip 10.0.0.29 +port 27015 +map de_dust2"
Server started
bash-4.1$ sudo ./server.sh stop /home/servers/test-server cstrike_Cl91Dj_27015 "./hlds_run -console -game cstrike +ip 10.0.0.29 +port 27015 +map de_dust2"
No screen session found.
Server stopped
Только с веба этот скрипт всё равно пишет туже ошибку

sudo: no tty present and no askpass program specified

К сожалению в кодинге не силён... ((( только учусь.

Вот код скрипта

#!/bin/bash

#
# Скрипт запуска HLDS сервера
#
# Данный скрипт используется для управления игровыми серверами через АдминПанель
#
# 
# Параметры запуска
#
# @command - команда (start|stop|restart|status|get_console)
# @dir - директория относительно скрипта
# @name - имя для screen
# @serverip - ip сервера
# @port - порт сервера
# @start_command - команда для сервера (напр. 'hlds_run -game valve +ip 127.0.0.1 +port 27015 +map crossfire')
# @user - пользователь, под которым будет запущен игровой сервер (если пусто, то будет использован root)
#
# Example:
# ./server.sh start /home/hl_server screen_hldm 127.0.0.1 27015 "hlds_run -game valve +ip 127.0.0.1 +port 27015 +map crossfire" user
#
#
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin

# Раскомментируйте строчку ниже, если не запускается игровой сервер
# во многих случаях, особенно для виртуальных серверов, это помогает
#export CPU_MHZ=2000

# Directory
DIR=$2

PIDFILE_NAME="server.pid"
PIDFILE="$DIR/$PIDFILE_NAME"

# Screen Name
NAME=$3

# IP
SERVER_IP=$4

# Port
SERVER_PORT=$5

# Command
COMMAND=$6

if [[ $7 == '' ]]
then
	USER=$(whoami)
else
	USER=$7
fi

case "$1" in
 start)
    if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
		then
		echo "Server is already running"
    else
		su $USER -c "cd $DIR; screen -m -d -S $NAME $COMMAND"
		sleep 4
		
		if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
			then
			echo "Server started"
		else
		   echo -e "Server not started \nStart command:"
		   echo su $USER -c "cd $DIR; screen -m -d -S $NAME $COMMAND"
		fi
    fi
    ;;

 stop)
    if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
       then
       kill -TERM `ps aux | grep -v grep | grep -i $USER | grep -i screen | grep -i $NAME | awk '{print $2}'`
       su $USER -c  "screen -X -S $NAME kill"
       echo "Server stopped"
    else
       echo "Coulnd't find a running server"
    fi
    ;;

 restart)
    if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
		then
		kill -TERM `ps aux | grep -v grep | grep -i $USER | grep -i screen | grep -i $NAME | awk '{print $2}'`
		su $USER -c  "screen -X -S $NAME kill"
		sleep 2
       
		su $USER -c "cd $DIR; screen -m -d -S $NAME $COMMAND"
		sleep 4
		
		if [[ `su $USER -c "screen -ls |grep $NAME"` ]]
			then
			echo "Server restarted"
		else
		   echo -e "Server not restarted \nStart command:"
		   echo su $USER -c "cd $DIR; screen -m -d -S $NAME $COMMAND"
		fi
    else
       echo "Coulnd't find a running server"
    fi
    ;;
 status)
    if [ -e ${PIDFILE} ] && [ $(ps -p $(cat ${PIDFILE})|wc -l) = "2" ] ;
    	then
       echo "Server is UP"
    else
       echo "Server is Down"
    fi
    ;;
 get_console)
	
	if [[ $4 == '' ]]
	then
		USER=$(whoami)
	else
		USER=$4
	fi
	
	su $USER -c "screen -S $NAME -X -p 0 hardcopy -h $DIR/console.txt && chmod 666 $DIR/console.txt"
	RESULT=`cat $DIR/console.txt`
	echo -e "$RESULT"
	;;
 *)
    echo "Usage all parameters"
    exit 1
    ;;
esac

exit 0
На сколько я понял он пытается выполнить su apache -c ...... Что собственно не работает... и просит пароль... Подскажите можно ли это как то исправить ??? разработчики говорят что это не имеет значения..

Finalls ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.