![如何创建运行程序而不是完整 shell 的 SSH 服务器?](https://linux22.com/image/1292697/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%80%8C%E4%B8%8D%E6%98%AF%E5%AE%8C%E6%95%B4%20shell%20%E7%9A%84%20SSH%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F.png)
我有一个程序想要通过 ssh(甚至是 telnet,程序的安全性并不重要)共享,但我不想允许连接访问系统中除该程序的 I/O 之外的任何其他内容(例如没有 scp、没有完整的 shell 访问权限、没有 ssh 隧道)。这可能吗?在 Ubuntu 系统上我该怎么做?
能够以本地用户身份或以 身份运行此功能可获得奖励积分nobody
。
答案1
GNU Netcat 似乎在某种程度上可以工作(使用 -e),但只能支持一个用户/会话/实例,理想情况下,我希望能够多次连接而不必重新启动服务器。
索卡特可以分叉。
我建议浏览一下例子
socat TCP4-LISTEN:5555,fork,tcpwrap=script \
EXEC:/bin/myscript,chroot=/home/sandbox,su-d=sandbox,pty,stderr
一个简单的服务器,它接受连接(TCP4-LISTEN)并为每个连接派生一个新的子进程;每个子进程都充当单个中继。客户端必须符合 /etc/hosts.allow 和 /etc/hosts.deny 中守护进程名称“script”的规则,否则将被拒绝访问(请参阅“man 5 hosts_access”)。为了执行程序,子进程 chroot 到 /home/sandbox,su 到用户沙箱,然后启动程序 /home/sandbox/bin/myscript。Socat 和 myscript 通过伪 tty (pty) 进行通信;myscript 的 stderr 被重定向到 stdout,因此其错误消息通过 socat 传输到连接的客户端。
答案2
我认为有两种简单的方法:
创建本地用户,使您的程序可以作为登录 shell 执行。
添加一个调用你的程序的 xinetd 服务(然后用户可以 telnet 到该服务)
答案3
创建将使用服务器的用户,如下所示:
adduser -s /bin/software username
在哪里/bin/软件是软件的位置,用户名是用户的用户名。
请注意,如果人们发现您的软件存在安全漏洞,他们仍然可以访问 shell。