2

Я пытаюсь запустить команду sudo через SSH так:

ssh domain.com sudo -u user bash -c "cd /home/user/ && ls"

(который является просто примером).

Я вернусь:

/home/user/: line 0: cd: /root: Permission denied

Интересно, почему sudo пытается перейти в /root?

3 ответа3

1

Мне кажется, что есть два подхода к этому:

  1. Сосредоточение на получении вашей команды для запуска в правильном каталоге. Для этого я бы предложил флаг -i для sudo, который настроит окружение так, как если бы вы вошли в систему как этот пользователь, поэтому:

    ssh domain.com sudo -iu user ls
    
  2. Сосредоточьтесь на решении проблемы цитирования, чтобы ваша цитируемая команда все еще могла рассматриваться как один аргумент для bash , чтобы она выполнялась как одна командная строка. Для этого в данном случае, кажется, вам нужен еще один уровень цитирования, например:

    ssh domain.com sudo -u user bash -c "'cd /home/user/ && ls'"
    

    или же:

    ssh domain.com sudo -u user bash -c '"cd /home/user/ && ls"'
    

    Объяснение: Оболочка, в которой вы вызываете ssh, принимает один набор кавычек, передавая ssh следующий (используя первый пример выше) список аргументов (как argv , после argv[0] of ssh):

    1. domain.com
    2. sudo
    3. -u
    4. user
    5. bash
    6. -c
    7. 'cd /home/user && ls'

    Это тогда заставляет sudo получить список аргументов:

    1. -u
    2. user
    3. bash
    4. -c
    5. cd /home/user && ls

    который sudo затем анализирует свои собственные аргументы, а затем передает остальное bash, в противном случае неизмененным, так что bash получает аргументы:

    1. -c
    2. cd /home/user && ls

    Затем bash принимает второй аргумент в виде командной строки, как если бы он был введен в интерактивную оболочку, а затем запускает первую команду (cd /home/user), а также (из-за &&) запускает вторую (ls) если первое удастся.

Честно говоря, я бы, наверное, выбрал первый вариант ... Но второе также работает для вашего тривиального примера, и в зависимости от реальности вашей реальной проблемы, может подходить или не подходить вам.

1

Хорошо, совет @ Zoredache был тем, кто помог больше всего здесь:

когда вы выпускаете

ssh domain.com sudo -u user bash -c "cd /home/user/ && ls"

с исходного хоста, на хосте назначения это на самом деле выполняется

sudo -u user bash -c cd /home/user/ && ls

что переводится на

sudo -u user bash -c cd /root

поскольку cd без аргумента изменяется в домашний каталог, и в этом случае это не домашний каталог пользователя sudo, а домашний каталог пользователя, который выдает sudo (то есть root)

решение состоит в том, чтобы избежать каждого специального символа, подобного этому

sudo -u user bash -c \"cd /home/ \&\& ls\"

но я уверен, что есть более простой способ или нет?

0

У вас есть разрешение на просмотр каталога / ?

Если нет, то попробуйте это:

ssh domain.com sudo -u user bash -c "cd ~ && ls"

Если вы это сделаете, попробуйте запустить это:

ssh domain.com sudo -u user bash -c "cd /home/user/ && ls && whoami && groups user"

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