Paramiko 和伪 tty 分配

发布于 2024-09-03 07:35:45 字数 363 浏览 9 评论 0原文

我正在尝试使用 Paramiko 连接到远程主机并执行许多文本文件替换。

i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/" 
                              + replaced + "/g'" + conf);

其中一些命令需要作为 sudo 运行,这会导致:

sudo:抱歉,您必须有一个 tty 才能 运行须藤

我可以使用 -t 开关和 ssh 强制进行伪 tty 分配。

使用 paramiko 可以做同样的事情吗?

I'm trying to use Paramiko to connect to a remote host and execute a number of text file substitutions.

i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/" 
                              + replaced + "/g'" + conf);

Some of these commands need to be run as sudo, which results in:

sudo: sorry, you must have a tty to
run sudo

I can force pseudo-tty allocation with the -t switch and ssh.

Is it possible to do the same thing using paramiko?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

稍尽春風 2024-09-10 07:35:46

其实很简单。只是:

stdin, stdout, stderr = client.exec_command(command,  get_pty=True)

Actually it's quite simple. Just:

stdin, stdout, stderr = client.exec_command(command,  get_pty=True)
錯遇了你 2024-09-10 07:35:46

以下代码对我有用:

#!/usr/bin/env python
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('localhost',username='root',password='secret')
chan = ssh.get_transport().open_session()
chan.get_pty()
chan.exec_command('tty')
print(chan.recv(1024))

这只是通过在线查看一些示例而组装而成的......不确定它是否是“正确”的方式。

The following code works for me:

#!/usr/bin/env python
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('localhost',username='root',password='secret')
chan = ssh.get_transport().open_session()
chan.get_pty()
chan.exec_command('tty')
print(chan.recv(1024))

This was just assembled from looking at a few examples online... not sure if its the "right" way.

纵性 2024-09-10 07:35:46

我认为您需要 SSHClient 对象的 invoke_shell 方法(我很乐意提供一个 URL,但 paramiko 文档位于 lag.net 是框架重的,只是不会向我显示文档中给定位置的特定 URL) - 它为您提供了Channel,您可以在其上执行 exec_command 等操作,但通过伪终端(包含终端类型以及行数和列数!-)来执行此操作,这似乎成为你所要求的。

I think you want the invoke_shell method of the SSHClient object (I'd love to give a URL but the paramiko docs at lag.net are frame-heavy and just won't show me a specific URL for a given spot in the docs) -- it gives you a Channel, on which you can do exec_command and the like, but does that through a pseudo-terminal (complete with terminal type and numbers of rows and columns!-) which seems to be what you're asking for.

雨巷深深 2024-09-10 07:35:46

根据 sudo 手册页:

-S(stdin)选项使 sudo 从标准输入而不是终端设备读取密码。这
密码后面必须跟一个换行符。

您可以写入标准输入,因为它是一个带有 write() 的文件对象:

import paramiko

client = paramiko.client.SSHClient()
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
client.connect(hostname='localhost', port=22, username='user', password='password')
stdin, stdout, stderr = client.exec_command('sudo -S aptitude update')
stdin.write('password\n')
stdin.flush()
# print the results
print stdout.read()
client.close()

According to the sudo manpage:

The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device. The
password must be followed by a newline character.

You can write to the stdin because it is a file object with write():

import paramiko

client = paramiko.client.SSHClient()
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
client.connect(hostname='localhost', port=22, username='user', password='password')
stdin, stdout, stderr = client.exec_command('sudo -S aptitude update')
stdin.write('password\n')
stdin.flush()
# print the results
print stdout.read()
client.close()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文