Одна вещь, которую нужно исправить, прежде чем перейти к реальному ответу. Использование «% user1» означает «люди в группе user1»; вы, вероятно, просто хотите, чтобы "user1" означало user1.
Во-вторых, sudo не знает, где вы вошли в систему из - только там, где вы сейчас запускаете sudo.
В-третьих, убедитесь, что вы используете visudo для внесения изменений; он попытается помешать вам сделать синтаксические ошибки.
В-четвертых, добавление строки sudoers только увеличивает ваш текущий доступ; это не помешает вам запускать другие скрипты; если вам нужен sudo для этих скриптов, тогда вам понадобится больше записей sudoers.
Вы спросили об ограничении функциональности соединениями с server1
. Я бы сделал это с помощью ssh
. Код для изменения пользователей предназначен для Debian/Ubuntu. Принципы и большинство другого кода должны быть достаточно универсальными. После выполнения этой конфигурации для выполнения скрипта на server2
с server1
, вы выполните следующую команду:
$ ssh -i ~/.ssh/script_identity.pub ruser@server2
Приведенная выше команда подключится к server2
и запустит ваш скрипт, не требуя дальнейшего вмешательства для аутентификации ssh
или sudo
. Файл открытого ключа ssh
является единственным доступом для удаленного запуска сценария на server2
, что позволяет вам решать, какие машины и/или учетные записи могут получить доступ к сценарию через ssh
.
Код для выполнения этих задач показан ниже в этом описании.
Эта конфигурация требует выделенной учетной записи на server2
. Есть много веских причин, одну из которых вы уже упомянули - возможность заблокировать себя на server2
, или, что еще хуже, случайно модифицировать не те файлы в рабочей учетной записи.
ssh
для ограниченного удаленного доступасервере1
сервере1
, где вы будете выполнять скрипт, создайте новый ssh-ключ, который будет использоваться только для выполнения удаленного скрипта. command=
в sshd
manpage). сервере2
(все будет делаться удаленно с сервера1
) сервере2
. .ssh/authorized_keys
в домашний каталог нового пользователя на сервере2
. сервере2
. После сохранения следующего скрипта как ruser.sh
на server1
, и после того, как вы поймете, что он будет делать, дайте эту команду на выполнение:
$ sh ./ruser.sh ruser server2
Сохраните этот скрипт как ruser. sh
в вашей учетной записи пользователя на system1
:
#!/bin/sh -e
#
# ruser.sh -- setup user on remote host for secure remote script execution
#
# This is for first time setup!
# Always use a new user on remote host.
#
USAGE="ERROR: Usage: sh $0 remote-username remote-hostname"
RUSER="${1:?$USAGE}"
RHOST="${2:?$USAGE}"
UNIQUE=$$
# build files that will be transferred to the remote host
# Make the new ssh key, and modify the public key so that
# it can only be used to execute "./rscript.sh"
ssh-keygen -N '' -f ~/.ssh/script_identity
sed -i '1 {
s,command="./rscript.sh",,
s,^,command="./rscript.sh" ,
}' ~/.ssh/script_identity.pub
# rscript.sh -- the only script that can be executed
# with the modified public key.
printf '%s' '(id;date) > rscript.out' > /tmp/rscript.sh.$$
# copy the new identity public key and rscript.sh to the remote host
scp ~/.ssh/script_identity.pub "${RHOST}":/tmp/script_identity.pub.${UNIQUE}
scp /tmp/rscript.${UNIQUE} "${RHOST}":/tmp/script_identity.pub.${UNIQUE}
# setup remote user for script execution
# Create new user
# Move identity file and script to new user's home directory.
# Fix ownership and permissions
ssh -t ${RHOST} "sudo /bin/sh -cex '
adduser --system --shell=/bin/sh ${RUSER};
mkdir -m0700 ~${RUSER}/.ssh;
mv /tmp/script_identity.pub.${UNIQUE} ~${RUSER}/.ssh/authorized_keys;
mv /tmp/rscript.sh.${UNIQUE} ~${RUSER}/rscript.sh
chmod -R 0600 ~${RUSER}/.ssh/;
chmod 0700 ~${RUSER}/.ssh/;
chmod 0700 ~${RUSER}/rscript.sh;
chown -R ${RUSER}:nogroup ~${RUSER}/;
'
"
# remove temp files
rm -rf /tmp/rscript.sh.${UNIQUE}
Проверьте вышеуказанную конфигурацию на server1
, выполнив:
$ ssh -i ~/.ssh/script_identity.pub ruser@server2
Затем проверьте домашний каталог ruser
на server2
, чтобы убедиться, что файл rscript.out
действительно был создан, что указывает на то, что все настроено правильно.
Если это так, измените ruser@server2:rscript.sh
для вызова вашего /path/to/myscript
. Перед изменением файла sudoers снова выполните команду ssh для запуска удаленного скрипта, чтобы убедиться, что вывод информации и ошибок работает так, как вы хотите.
Теперь настройте файл sudoers server2
, чтобы разрешить этому новому пользователю на server2
выполнять только один скрипт как root без пароля.
ruser ALL = NOPASSWD: /path/to/myscript
Поздравляем, теперь вы можете безопасно запускать привилегированные скрипты удаленно без ssh
, sudo
или системных паролей.