我如何让我的自定义Shell与SSH一起工作?
我正在用Python制作一个自定义的命令行界面,给一个在服务器上通过SSH和公钥认证登录的用户使用。这个用户需要在特定的目录下运行一些命令,比如ls
、find -type d
和cat
,但有一些限制。如果你用命令ssh user@server -i keyfile
登录,能看到交互式的提示符,这样就可以正常运行这些命令了。然而,如果你用ssh user@server -i keyfile "ls /var/log"
这样的命令,就不行了。ssh
会一直卡在那里,没有任何反应。通过使用-v
这个选项,我发现连接是成功的,所以问题出在我的命令行界面上。我也很确定脚本根本没有被启动,因为在程序开始时用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
我该如何让这个命令行脚本在命令行传入命令时运行,这样就可以在脚本中使用,而不需要启动一个交互式的命令行?
1 个回答
3
ssh不响应的问题,主要是因为使用 ssh user@host cmd
这个命令时,并不会为要运行的命令打开一个终端。你可以试试用 ssh user@host -t cmd
来解决这个问题。
不过,即使你加上了 -t
这个选项,你的脚本还是会遇到另一个问题:它只能在交互模式下工作,而且完全忽略了传入的 $SSH_ORIGINAL_PROGRAM。一个简单的解决办法是检查一下 sys.argv
,如果它的长度大于1,就不要一直循环,而是只执行你在里面的那个命令。