Я не думаю, що я бачив, щоб хтось пропонував це, і ОП просто сказала "сценарій", так що ...
Мені потрібно було вирішити ту саму проблему, і моя найзручніша мова - Python.
Я користувався бібліотекою параміко. Крім того, мені також потрібно було видавати команди, для яких мені потрібні ескалаційні дозволи sudo
. Виявляється, sudo може прийняти свій пароль через stdin через прапор "-S"! Дивись нижче:
import paramiko
ssh_client = paramiko.SSHClient()
# To avoid an "unknown hosts" error. Solve this differently if you must...
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# This mechanism uses a private key.
pkey = paramiko.RSAKey.from_private_key_file(PKEY_PATH)
# This mechanism uses a password.
# Get it from cli args or a file or hard code it, whatever works best for you
password = "password"
ssh_client.connect(hostname="my.host.name.com",
username="username",
# Uncomment one of the following...
# password=password
# pkey=pkey
)
# do something restricted
# If you don't need escalated permissions, omit everything before "mkdir"
command = "echo {} | sudo -S mkdir /var/log/test_dir 2>/dev/null".format(password)
# In order to inspect the exit code
# you need go under paramiko's hood a bit
# rather than just using "ssh_client.exec_command()"
chan = ssh_client.get_transport().open_session()
chan.exec_command(command)
exit_status = chan.recv_exit_status()
if exit_status != 0:
stderr = chan.recv_stderr(5000)
# Note that sudo's "-S" flag will send the password prompt to stderr
# so you will see that string here too, as well as the actual error.
# It was because of this behavior that we needed access to the exit code
# to assert success.
logger.error("Uh oh")
logger.error(stderr)
else:
logger.info("Successful!")
Сподіваюся, що це комусь допоможе. Моїм випадком використання було створення каталогів, надсилання та видалення файлів та запуск програм на ~ 300 серверах одночасно. Таким чином, автоматизація мала першорядне значення. Я спробував sshpass
, expect
а потім придумав це.