我如何让我的自定义Shell与SSH一起工作?

3 投票
1 回答
2935 浏览
提问于 2025-04-18 16:36

我正在用Python制作一个自定义的命令行界面,给一个在服务器上通过SSH和公钥认证登录的用户使用。这个用户需要在特定的目录下运行一些命令,比如lsfind -type dcat,但有一些限制。如果你用命令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,就不要一直循环,而是只执行你在里面的那个命令。

撰写回答