ฉันไม่คิดว่าฉันเห็นใครแนะนำสิ่งนี้และ OP เพียงแค่พูดว่า "สคริปต์" ดังนั้น ...
ฉันต้องการแก้ปัญหาเดียวกันและภาษาที่สะดวกสบายที่สุดของฉันคือ Python
ฉันใช้ห้องสมุด paramiko 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
และจากนั้นมาด้วยนี้