5

我可以执行需要在 ipython 和/或 ipython 笔记本中输入的 shell 命令吗?

当我执行这样的命令时,我看到它是提示符,但没有明显的方法可以从我的键盘向它提供输入。

一个示例可以是rsync对远程服务器的命令(因此需要密码)。毫无疑问,这里存在安全方面的危险——在我的情况下,这些在我运行时有所减少localhost

4

4 回答 4

3

重新发布作为答案,并提供更多详细信息:

不,这是一个很难解决的长期问题:github.com/ipython/ipython/issues/514

问题大致是我们的架构无法判断进程何时等待输入,因此它不知道提示用户输入。

您可以使用 pexpect 和 raw_input 来模拟特定程序的情况。即,如果您说出提示的样子,它会在输出中发现它,并要求用户输入以发送回进程。例如对于 Python:

import pexpect
p = pexpect.spawn('python')
while True:
    try:
        p.expect('\n>>> ')
        print(p.before)
        p.sendline(raw_input('>>> '))
    except pexpect.EOF:
        break

我刚刚对此进行了简短的测试 - 它有效,但相当粗糙。这个概念可以改进。

于 2013-09-20T23:11:11.983 回答
1

可悲的是没有。

我找不到这方面的文档,所以我去源头潜水。实际执行该转换的 ipython 代码是https://github.com/ipython/ipython/blob/master/IPython/core/inputtransformer.py#L208,具体来说:

def _tr_system(line_info):
    "Translate lines escaped with: !"
    cmd = line_info.line.lstrip().lstrip(ESC_SHELL)
    return '%sget_ipython().system(%r)' % (line_info.pre, cmd)

换句话说,它使用!.

ipython 可能不是您想要的——查看这个答案,了解 Python 替代品以包含在脚本中。

于 2013-09-20T01:02:54.097 回答
1

只是在寻找这个,当我看到它有点问题时,我的脸掉了下来。以为我会发布我的解决方案,以防它对其他人有用。

基本上我正在寻找一种sudo通过笔记本发送命令的方法,可能不是很明智,但我需要它来做我正在做的事情。而且我无法提示输入密码。所以决定使用 ax-terminal并将命令发送到终端。您没有得到任何反馈,但可能是由于在返回的路上没有连接到 IO。这是我在笔记本中使用的:

在 [1] !xterm -e sudo mount -o loop system.img /system/

我正在使用linux,但我希望!cmdwindows也可以做到这一点

于 2015-03-10T19:39:58.597 回答
1

许多需要密码的程序提供了多种方式来提示用户输入密码,因此jupyter您不必为您输入密码。该sudo命令有一个-A选项和SUDO_ASKPASS环境变量。我已经像这样使用它来使用 sudo 来获取/var/log/btmp.1文件的权限:

 In [1]: !SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A lastb -a -f /var/log/btmp.1 | head

同样,对于您的情况,ssh有一个SSH_ASKPASS环境变量。

请注意,对于 ssh/rsync 的无头操作,您可以完全避免来自笔记本的身份验证提示,方法是直接设置 ssh 代理(如果它尚未运行)并使用SSH_AUTH_SOCK变量引用它,就像这样ssh-add做一样。或者,您可以使用其他程序SSH_ASKPASS以自定义方式处理身份验证。请参阅如何使用密码自动登录 SSH?- 服务器故障了解更多详细信息,但请注意不要损害您的安全性,尤其是在尝试自动从一台服务器连接到另一台服务器时。

于 2017-01-29T16:09:01.527 回答