如何使用ssh使我的自定义shell工作?

时间:2014-08-08 19:01:15

标签: python linux ssh stdio

我在Python中为服务器上的非常有限的用户创建自定义shell,该服务器通过ssh使用公钥身份验证登录。他们需要能够在具有某些限制的特定目录中运行lsfind -type dcat。如果您运行类似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?

1 个答案:

答案 0 :(得分:3)

ssh没有响应的问题与ssh user@host cmd没有为正在运行的命令打开终端这一事实有关。尝试拨打ssh user@host -t cmd

但是,即使您传递了-t选项,您的脚本仍会遇到另一个问题:它只能以交互方式工作,完全忽略传递的$ SSH_ORIGINAL_PROGRAM。一个天真的解决方案是检查sys.argv,如果它大于1,你不会永远循环,而只执行你在其中的任何命令。