我在Python中为服务器上的非常有限的用户创建自定义shell,该服务器通过ssh使用公钥身份验证登录。他们需要能够在具有某些限制的特定目录中运行ls
,find -type d
和cat
。如果您运行类似ssh user@server -i keyfile
的内容,这可以正常工作,因为您可以看到交互式提示,并且可以运行这些命令。但是,ssh user@server -i keyfile "ls /var/log"
之类的东西并不存在。 ssh
只是挂起,没有回应。通过使用-v
开关,我发现连接成功,所以问题出在我的shell中。我还相当确定脚本甚至没有启动,因为程序开头的print sys.argv
什么都不做。这是代码:
#!/usr/bin/env python
import subprocess
import re
import os
with open(os.devnull, 'w') as devnull:
proc = lambda x: subprocess.Popen(x, stdout=subprocess.PIPE, stderr=devnull)
while True:
try:
s = raw_input('> ')
except:
break
try:
cmd = re.split(r'\s+', s)
if len(cmd) != 2:
print 'Not permitted.'
continue
if cmd[0].lower() == 'l':
# Snip: verify directory
cmd = proc(['ls', cmd[1]])
print cmd.stdout.read()
elif cmd[0].lower() == 'r':
# Snip: verify directory
cmd = proc(['cat', cmd[1]])
print cmd.stdout.read()
elif cmd[0].lower() == 'll':
# Snip: verify directory
cmd = proc(['find', cmd[1], '-type', 'd'])
print cmd.stdout.read()
else:
print 'Not permitted.'
except OSError:
print 'Unknown error.'
这里是〜/ .ssh / authorized_keys的相关行:
command="/path/to/shell $SSH_ORIGINAL_COMMAND" ssh-rsa [base-64-encoded-key] user@host
如何在命令行上传递命令时创建shell脚本,以便可以在脚本中使用它而无需启动交互式shell?
答案 0 :(得分:3)
ssh没有响应的问题与ssh user@host cmd
没有为正在运行的命令打开终端这一事实有关。尝试拨打ssh user@host -t cmd
。
但是,即使您传递了-t
选项,您的脚本仍会遇到另一个问题:它只能以交互方式工作,完全忽略传递的$ SSH_ORIGINAL_PROGRAM。一个天真的解决方案是检查sys.argv
,如果它大于1,你不会永远循环,而只执行你在其中的任何命令。