相关疑难解决方法(0)

如何让ssh从stdin接收密码

如何使SSH从stdin读取密码,默认情况下不会这样做?

passwords ssh stdin

23
推荐指数
5
解决办法
5万
查看次数

使用子进程发送密码

我正在尝试使用python子进程模块登录到一个安全的ftp站点,然后获取一个文件.但是,我一直在试图在请求密码时发送密码.到目前为止,我有以下代码:

from subprocess import Popen, PIPE

proc = Popen(['sftp','user@server', 'stop'], stdin=PIPE)
proc.communicate('password')
Run Code Online (Sandbox Code Playgroud)

这仍然在密码提示符处停止.如果我手动输入密码,则转到ftp站点,然后在命令行输入密码.我见过人们建议使用pexpect,但长话短说我需要一个标准的库解决方案.无论如何还有子进程和/或任何其他stdlib?我上面忘记了什么?

python sftp subprocess

18
推荐指数
4
解决办法
4万
查看次数

使用pxssh时无法为pexpect导入名称'spawn'

这是我试图运行的代码:

from pexpect import pxssh
s = pxssh.pxssh()
if not s.login ('myip', 'myusername', 'mypassword'):
    print ("SSH session failed on login.")
    print (str(s))
else:
    print ("SSH session login successful")
    s.sendline ('ls -l')
    s.prompt()         # match the prompt
    print (s.before)     # print everything before the prompt.
    s.logout()
Run Code Online (Sandbox Code Playgroud)

我在运行它时遇到的错误是:

Traceback (most recent call last):
  File "test_pexpect.py", line 1, in <module>
    from pexpect import pxssh
  File "C:\Python35\lib\site-packages\pexpect\pxssh.py", line 23, in <module>
    from pexpect import ExceptionPexpect, TIMEOUT, EOF, spawn
ImportError: cannot import name 'spawn'
Run Code Online (Sandbox Code Playgroud)

谁能帮我吗?我在Windows上使用python3.5

python pexpect python-3.x python-3.5

8
推荐指数
1
解决办法
8630
查看次数

从 asyncio 子进程获取实时输出

我正在尝试使用 Python asyncio 子进程来启动交互式 SSH 会话并自动输入密码。实际用例并不重要,但它有助于说明我的问题。这是我的代码:

    proc = await asyncio.create_subprocess_exec(
        'ssh', 'user@127.0.0.1',
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.STDOUT,
        stdin=asyncio.subprocess.PIPE,
    )

    # This loop could be replaced by async for, I imagine
    while True:
        buf = await proc.stdout.read()
        if not buf:
            break
        print(f'stdout: { buf }')
Run Code Online (Sandbox Code Playgroud)

我希望它能像 asyncio 流一样工作,我可以在其中创建两个任务/子例程/future,一个用于监听StreamReader(在本例中由 给出proc.stdout),另一个用于写入 StreamWriter ( proc.stdin)。

但是,它并没有按预期工作。ssh 命令的前几行输出直接打印到终端,直到出现密码提示(或主机密钥提示,视情况而定)并等待手动输入。我希望能够读取前几行,检查它是否要求输入密码或主机提示,并相应地写入 StreamReader。

它运行该行的唯一一次print(f'stdout: { buf }')是在我按 Enter 键后,当它打印时,显然,“stderr:b'主机密钥验证失败。\r\n'”。

我也尝试了推荐的proc.communicate(),它不像使用 StreamReader/Writer 那么简洁,但它有同样的问题:等待手动输入时执行冻结。

这实际上应该如何运作?如果这不是我想象的那样,为什么不呢?有没有什么方法可以实现这一点,而无需诉诸线程中的某种繁忙循环?

PS:我解释使用 ssh 只是为了清楚起见。我最终使用 plink 来实现我想要的功能,但我想了解如何使用 python 来运行任意命令。

python python-asyncio

8
推荐指数
2
解决办法
5908
查看次数

如何从python脚本在linux中设置用户密码?

我正在尝试自动设置SFTP访问.此脚本作为具有sudo权限且没有密码的用户运行.

我可以像这样创建一个用户:

>>> import subprocess
>>> process = subprocess.Popen(['sudo', 'useradd', 'test'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> process.communicate()
('', '')
Run Code Online (Sandbox Code Playgroud)

接下来我需要设置用户的密码,但我无法弄清楚如何.这是我尝试过的.

>>> process = subprocess.Popen(['sudo', 'chpasswd'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> process.communicate('test:password')
Run Code Online (Sandbox Code Playgroud)

在我的python程序中它没有任何效果,在交互式解释器中它在第一行之后锁定.

最好的方法是什么?

我在Ubuntu lucid上运行python 2.6.

python subprocess user-management

6
推荐指数
2
解决办法
1万
查看次数

在Python 3中调用pexpect模块的expect方法时的TypeError

我正在尝试使用Python 3.4.0的pexpect模块(版本3.3).我收到一个错误

TypeError:必须是str,而不是字节

当我调用child.expect方法时.

实际代码是pexpect文档的标准示例:

child = pexpect.spawn('ssh foo@bar.com')
index = child.expect([pexpect.TIMEOUT, pexpect.EOF, ssh_newkey, '.*password:'])
Run Code Online (Sandbox Code Playgroud)

完全相同的代码适用于pexpect模块(版本3.1)和Python版本2.7.6.

GitHub上的Pexpect文档指出,pexpect版本3.3需要Python 2.6或3.2或更高版本.有没有人知道pexpect是否因为某些原因而无法使用Python 3,尽管该模块的文档中有说明?

这是我获得的回溯输出:

Traceback (most recent call last):
  File "/home/sambo9/python/python3-pexpect.py", line 17, in <module>
    main()
  File "/home/sambo9/python/python3-pexpect.py", line 13, in main
    child.expect('.*password:')
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 1451, in expect
    timeout, searchwindowsize)
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 1466, in expect_list
    timeout, searchwindowsize)
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 1535, in expect_loop
    c = self.read_nonblocking(self.maxread, timeout)
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 985, in read_nonblocking
    self._log(s, 'read')
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 908, in _log
    second_log.write(s) …
Run Code Online (Sandbox Code Playgroud)

python pexpect python-3.x

5
推荐指数
1
解决办法
1532
查看次数