Как выполнить команду '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)
как в документах