5

Прочитав этот вопрос, я знаю, что я должен сделать

sudo sh -c 'ls -hal /root/ > /root/test.out'

чтобы избежать ошибки "Отказано в доступе".

Но, когда я делаю

ssh hostname sudo sh -c 'ls -hal /root/ > /root/test.out'

с другой машины, я получаю

bash: /root/test.out: Permission denied

Зачем? И как я могу заставить это работать?

Редактировать: есть линия

Defaults:<username>    !requiretty

до

<username> ALL= NOPASSWD: ALL

в /etc/sudoers .

я могу сделать

ssh remote-machine 'sudo ls /'

без каких-либо проблем. Так что я не думаю, что это проблема tty. Добавление -t не решает проблему.

1 ответ1

6

Проблема в том, что кавычки интерпретируются и удаляются локальной оболочкой, а не удаленной; вам нужен один дополнительный уровень:

ssh host sudo sh -c '"ls -hal /root/ > /root/test.out"'

Локальная оболочка будет использовать один уровень цитирования - здесь "используются" одинарные кавычки, ssh получит аргументы host , sudo , sh , -c и "ls -hal /root/ > /root/test.out" ,

Удаленная оболочка использует следующий слой - двойные кавычки - и вызывает sudo с помощью sh , -c и ls -hal /root/ > /root/test.out .

Наконец, экземпляр sh (работающий от имени root) вызывается с помощью -c и ls -hal /root/ > /root/test.out - и анализирует этот единственный аргумент как обычную командную строку , оценивая перенаправление.

Чтобы посмотреть все это, в целевой системе попробуйте запустить sudo strace -f -e execve -p $(cat /var/run/sshd.pid) .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .