Как выполнить команду 'su' с помощью parallel-ssh

Я хочу войти в два хоста, используя Parallels-SSH и выполнить su команда. Затем я хочу подтвердить, что я являюсь пользователем root, распечатав whoami

Код:

hosts = ['myHost1', 'myHost2']
client = ParallelSSHClient(hosts, user='myUser', password='myPassword')

output = client.run_command('su')

for host in output:
    stdin = output[host].stdin
    stdin.write('rootPassword\n')
    stdin.flush()

client.join(output)

output = client.run_command('whoami')

for host, host_output in output.items():
    for line in host_output.stdout:
        print("Host [%s] - %s" % (host, line))

Результат:

Host [myHost1] - myUser
Host [myHost2] - myUser

Очевидно, я ожидаю, что root в выводе. Я следую за документацией.

Я пытался использовать все разные окончания строки вместо \n и ничего не изменилось. Как я могу выполнить su использование команды parallel-ssh?

3 ответа

Решение

Оказывается, то, что я пытаюсь сделать, недостижимо.

Первая проблема

Я обнаружил в этом посте, что все команды находятся в своем собственном канале. Это означает, что даже если su будет успешным, это не повлияет на вторую команду. Автор поста рекомендует запустить

su -c whoami - root

Вторая проблема

Мне удалось отладить проблему еще дальше, изменив host_output.stdout в host_output.stderr Оказалось, что я получаю сообщение об ошибке, которое ранее не отображалось на терминале:

standard in must be a tty

Возможные решения этой проблемы здесь. Они не работают для меня, но могут работать для вас.

Для меня обходным путем было разрешить на всех моих хостах root вход в систему. И тогда в параллель-ssh я захожу как рут уже со всеми правами на месте.

Попробуй это:

      **def exec_command(hosts):
    strr = ""
    client = ParallelSSHClient(hosts, user='admin', password='admin_password')
    cmd = 'echo root_password |su -c "commmand" root'
    output = client.run_command(cmd)
    client.join()
    for host_out in output:
    for line in host_out.stdout:
        strr+=line+" "
    return strr
    **

'echo root_password |su -c "команда" root'

Попробуй поставить sudo=True в конце run_command

output = client.run_command(<..>, sudo=True)

как в документах

Другие вопросы по тегам