Tôi không nghĩ rằng tôi đã thấy ai đề xuất điều này và OP chỉ nói "kịch bản" nên ...
Tôi cần phải giải quyết vấn đề tương tự và ngôn ngữ thoải mái nhất của tôi là Python.
Tôi đã sử dụng thư viện paramiko. Hơn nữa, tôi cũng cần phải ban hành các lệnh mà tôi sẽ cần các quyền được tăng cường bằng cách sử dụng sudo
. Hóa ra sudo có thể chấp nhận mật khẩu của mình thông qua stdin thông qua cờ "-S"! Xem bên dưới:
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!")
Hy vọng điều này sẽ giúp được ai đó. Trường hợp sử dụng của tôi là tạo thư mục, gửi và giải nén các tệp và khởi động chương trình trên ~ 300 máy chủ. Như vậy, tự động hóa là tối quan trọng. Tôi đã thử sshpass
, expect
và sau đó đã đưa ra điều này.