Я полагаю, что причина, по которой вы получаете сообщение об ошибке, заключается в том, что обычные пользователи не имеют правильных разрешений, установленных для чтения, записи или выполнения файлов, которые вы пытаетесь скопировать.
Я создал 2 файла: /root/FileByRoot и /home/admin/FileByAdmin.
$ ll /root/FileByRoot
-rw-r--r-- 1 root root 13 Oct 10 00:43 /root/FileByRoot
$ ll /home/admin/FileByAdmin
-rw-rw-r-- 1 admin admin 19 Oct 10 00:43 /home/admin/FileByAdmin
Вот что я получаю, когда пытаюсь скопировать их с правами администратора на другую машину.
$ scp -P 2220 admin@34.200.101.165:/root/FileByRoot /home/heysus/
admin@34.200.101.165's password:
scp: /root/FileByRoot: Permission denied
$ scp -P 2220 admin@34.200.101.165:/home/admin/FileByAdmin /home/heysus/
admin@34.200.101.165's password:
FileByAdmin 100% 19 0.5KB/s 00:00
$ ll /home/heysus/FileByAdmin
-rw-rw-r-- 1 heysus heysus 19 Oct 10 00:56 /home/heysus/FileByAdmin
Теперь давайте переместим файл в каталог, где администратор имеет полный доступ.
$ mv FileByRoot /home/admin/FileByRoot
Поскольку у администратора есть права доступа к папке, теперь я могу ее скопировать.
$ scp -P 2220 admin@34.200.101.165:/home/admin/FileByRoot /home/heysus/
admin@34.200.101.165's password:
FileByRoot
100% 13 0.3KB/s 00:00
В завершение включите пользователя root в файле конфигурации /etc/ssh/sshd _и скопируйте необходимые файлы через пользователя root. Когда вы закончите, отключите вход root в конфигурации /etc/ssh/sshd _.
Низкоуровневый -способ, позволяющий программе всегда работать под определенным UID, — это бит setuid в двоичном файле. Вот как, например. sudo
и su
получают права суперпользователя, даже если они обычно запускаются при обычном использовании. Но в целом Unix -подобные системы не поддерживают сценарии setuid , см.:Разрешить setuid для сценариев оболочки
Однако, что вы можете сделать, так это настроить sudo
или другой подобный инструмент, чтобы пользователи могли запускать определенные файлы с соответствующими привилегиями. Например, это позволит пользователю с именем viceadmin
запустить /usr/local/bin/sudoswapon
с любыми аргументами и без аутентификации :
viceadmin ALL = NOPASSWD:/usr/local/bin/sudoswapon
Теперь, поскольку sudo
имеет дело с изменением привилегий, sudoswapon
может быть сценарием оболочки.
Вы правы, заметив, что сценарий должен быть осторожен с тем, как он работает с аргументами командной строки, и что будут применяться все подводные камни языка оболочки. К счастью, sudo
отфильтровывает большинство переменных окружения, по крайней мере, если установлена опция env_reset
.
Вы не можете создать сценарий bash, который запускает setuid. Однако вы можете использоватьsudo
(или подобные программы, такие как calife ), чтобы убедиться, что они запускаются с привилегиями root.
Для этого есть два основных подхода.
Предположим, ваш скрипт называется reset-swap
и выполняет:
#!/bin/sh
swapoff /dev/sdb
shred -n0 -z /dev/sdb
mkswap /dev/sdb
swapon /dev/sdb
Вариант A:заключается в том, чтобы позволить любому пользователю выполнять эти отдельные команды и добавлять к ним префикс sudo:
#!/bin/sh
sudo swapoff /dev/sdb
sudo shred -n0 -z /dev/sdb
sudo mkswap /dev/sdb
sudo swapon /dev/sdb
и добавить к /etc/sudoers
ряд строк, позволяющих сделать это всем:
ALL ALL = NOPASSWD: /sbin/swapoff /dev/sdb
ALL ALL = NOPASSWD: shred -n0 -z /dev/sdb
ALL ALL = NOPASSWD: mkswap /dev/sdb
ALL ALL = NOPASSWD: swapon /dev/sdb
Тем не менее, несмотря на то, что указанные действия могут быть безопасными для выполнения каждым в соответствии со сценарием , это может быть не так независимо друг от друга. Например, mkswap
проверяет, не смонтирован ли раздел подкачки перед его обработкой, но shred
с радостью удалит смонтированный раздел подкачки.
Таким образом, было бы предпочтительнее использовать
Вариант B:позволяет запускать только этот скрипт с помощью sudo.
ALL ALL = NOPASSWD: /usr/local/bin/reset-swap
Тогда вы бы назвали это как sudo reset-swap
, а не reset-swap
. Если вы пофантазируете, скрипт мог бы поднять себя, если бы он не был запущен как root,разрешить запуск без указания префикса sudo
:
#!/bin/sh
if [ "`id -u`" -ne 0 ]; then
echo "Switching from `id -un` to root"
exec sudo "$0"
exit 99
fi
swapoff /dev/sdb
shred -n0 -z /dev/sdb
mkswap /dev/sdb
swapon /dev/sdb
Наконец, позвольте мне закончить парой пунктов из лекции о sudo :Думайте, прежде чем печатать. С большой силой приходит большая ответственность.
Давным-давно стало понятно, что setuid-скрипты создают непреодолимые проблемы с безопасностью, (их легко взломать, обманув IFS
), поэтому мы больше этого не делаем. Linux был изменен, чтобы помочь нам избежать сценариев setuid.
Вы можете достичь своих желаний с помощью sudo
, используя NOPASSWD
. Прочтите man sudoers sudo
.