编辑 2013 年 12 月:这是一个简短的答案:花一两天时间熟悉 Python 库“ Fabric ”。Fabric 解决了将远程任务分派到一台或多台服务器的大量问题。
您可能仍然希望在目标系统上设置一个可以运行无密码命令的用户名(您也可以使用 Fabric 来做到这一点!)。
请注意,Fabric 的某些方面并不完全符合 Python 风格。此外,Fabric 的设计首先考虑了系统管理员,即想要对服务器批量命令的人。如果您正在尝试做其他事情(例如自动化一些非常特定的服务器或场景),您将希望完全了解“使用设置”和/或 @roles 装饰器的工作原理。我没有回头...
(是的,我得到了在“远程”系统上运行的远程 SSH 命令。也就是说,服务器 A 要求服务器 B 连接到服务器 C,并且即使 A 不直接与服务器 A 对话,也可以在服务器 A 上看到该命令的返回服务器 C。使实验室设置更容易!)。
原始回复:这个问题有很多解决方案。课程用马;在不同的情况下,有些人比其他人更好。
提出的问题是,如何解决“无 TTY”错误。这似乎是重点,所以我认为关于 sudoers 的讨论只是试图解决 TTY 问题。
选项 1)Ashat 的回答效果很好……大多数时候。实际上,始终指定适用于更多目标系统的“-tt”。
请注意,如果您使用像 Paramiko 这样的 SSH 库,您仍然会遇到问题,它没有直观的“-t”方式。
选项 2)我的答案是指定一个 ASKPASS,即 STDIN。所以这个例子同时满足 sudo 密码要求和 TTY: $ shell> ssh user@domain.com 'echo "password"|sudo -S echo "foobar"'
选项 3) 是的,您可以对所有或部分用户禁用 sudo 密码检查,但这在生产服务器上并不酷。
选项 4)您可以远程“requiretty”(或为 sudoers 中的所有或部分用户设置“!requiretty”。同样,在生产盒上并不酷。
最好避免更改服务器。有一天,该服务器将被替换,设置恢复为默认设置,您的脚本将停止工作。
请注意,一旦您了解了所有选项,它就会打开更多自动化的大门(例如,您的笔记本电脑上的脚本可以连接到服务器主机名列表,并在这些服务器上执行 sudo 任务,而无需复制说脚本到这些服务器上)。