我可以执行需要在 ipython 和/或 ipython 笔记本中输入的 shell 命令吗?
当我执行这样的命令时,我看到它是提示符,但没有明显的方法可以从我的键盘向它提供输入。
一个示例可以是rsync
对远程服务器的命令(因此需要密码)。毫无疑问,这里存在安全方面的危险——在我的情况下,这些在我运行时有所减少localhost
。
我可以执行需要在 ipython 和/或 ipython 笔记本中输入的 shell 命令吗?
当我执行这样的命令时,我看到它是提示符,但没有明显的方法可以从我的键盘向它提供输入。
一个示例可以是rsync
对远程服务器的命令(因此需要密码)。毫无疑问,这里存在安全方面的危险——在我的情况下,这些在我运行时有所减少localhost
。
重新发布作为答案,并提供更多详细信息:
不,这是一个很难解决的长期问题: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
我刚刚对此进行了简短的测试 - 它有效,但相当粗糙。这个概念可以改进。
可悲的是没有。
我找不到这方面的文档,所以我去源头潜水。实际执行该转换的 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 替代品以包含在脚本中。
只是在寻找这个,当我看到它有点问题时,我的脸掉了下来。以为我会发布我的解决方案,以防它对其他人有用。
基本上我正在寻找一种sudo
通过笔记本发送命令的方法,可能不是很明智,但我需要它来做我正在做的事情。而且我无法提示输入密码。所以决定使用 ax-terminal
并将命令发送到终端。您没有得到任何反馈,但可能是由于在返回的路上没有连接到 IO。这是我在笔记本中使用的:
在 [1] !xterm -e sudo mount -o loop system.img /system/
我正在使用linux,但我希望!cmd
windows也可以做到这一点
许多需要密码的程序提供了多种方式来提示用户输入密码,因此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?- 服务器故障了解更多详细信息,但请注意不要损害您的安全性,尤其是在尝试自动从一台服务器连接到另一台服务器时。