OpenSSH/Cookbook/远程进程
OpenSSH 的主要功能之一是在其他系统上访问和运行程序。毕竟,这是该程序的主要目的之一。有几种方法可以扩展它,无论是交互式还是作为无人值守脚本的一部分。因此,除了交互式登录之外,ssh(1) 可用于简单地执行程序或脚本。当程序或脚本完成其过程时,将自动注销。一些组合是显而易见的。其他需要更仔细的规划。有时,仅仅知道可以做某事就足够了,而其他时候则需要更多细节。以下列出了一些使用 OpenSSH 运行远程任务的有用组合示例。
ssh(1) 的一个明显的用途是在远程系统上运行一个程序,然后退出。这通常是一个 shell,但可以是该帐户可用的任何程序。为了获得反馈,ssh(1) 传递了远程进程返回的任何退出值。当远程进程完成时,ssh(1) 将终止并将最后一个完成的远程进程的退出值传递给本地主机。因此,它可以在脚本中使用,并且客户端系统可以使用远程进程的结果。
以下将在远程系统上运行 true(1) 并将成功(退出代码 0)返回到运行 ssh(1) 的本地系统。
$ ssh -l fred server.example.org /bin/true
$ echo $?
0
以下将在远程系统上运行 false(1) 并将失败(退出代码 1)返回到运行 ssh(1) 的本地系统。
$ ssh -l fred server.example.org /bin/false
$ echo $?
1
如果返回了任何其他值(从 0 到 255),ssh(1) 将从远程主机将它们传递回本地主机。
可以使用正常的重定向在本地保存远程机器上运行的程序的输出。这里我们在远程机器上运行 dmesg(8)
$ ssh -l fred server.example.org dmesg > dmesg.from.server.log
交互式进程将难以或不可能以这种方式运行,因为看不到任何输出。对于需要任何用户输入的交互式进程,可以将输出通过管道传输到 tee(1),以便将输出同时发送到文件和 stdout。此示例在远程运行匿名 FTP 会话并将输出记录在本地。
$ ssh -l fred server.example.org "ftp -a anotherserver" | tee ftp.log
可能需要强制分配伪终端才能使输入和输出都正确可见。
$ ssh -t -l fred server.example.org "ftp -a anotherserver" | tee /home/fred/ftp.log
在读取一台机器上的数据并在另一台机器上处理数据的最简单方法是使用管道。
$ ssh [email protected] 'cat /etc/ntpd.conf' | diff /etc/ntpd.conf -
数据可以在一台系统上生成并在另一台系统上使用。这与 X 隧道不同,在 X 隧道中,程序和数据都驻留在另一台机器上,只有图形界面在本地显示。同样,在读取一台机器上的数据并在另一台机器上使用数据的最简单方法是使用管道。
$ cat /etc/ntpd.conf | ssh [email protected] 'diff /etc/ntpd.conf -'
如果本地程序希望从远程机器读取文件,则可以使用命名管道结合重定向来传输数据。在以下示例中,创建命名管道作为数据传输点。然后,ssh(1) 用于启动一个远程进程,该进程将输出发送到 stdout,该输出被本地机器上的重定向捕获并发送到命名管道,以便本地程序可以通过命名管道访问数据。
在此特定示例中,必须向 tcpdump(8) 本身添加一个筛选器规则,以防止如果 ssh(1) 通过与正在收集的数据相同的接口连接,则会发生无限反馈循环。通过排除 SSH 端口、SSH 连接使用的主机或相应的网络接口来防止此循环。
$ mkfifo -m 600 netdata
$ ssh -fq -i /home/fred/.ssh/key_rsa \
'sudo tcpdump -lqi eth0 -w - "not port 22"' > netdata
$ wireshark -k -i netdata &
tcpdump(8) 的任何 sudo(8) 特权也需要在没有交互式密码的情况下运行,因此必须非常小心和精确地写出 /etc/sudoers 中允许哪些程序和参数,绝不能更多。ssh(1) 的身份验证也必须以非交互方式进行,例如使用密钥和密钥代理。设置完配置后,运行 ssh(1) 并将其连接后发送到后台。在 ssh(1) 处于后台后,将启动本地应用程序,在本例中为 wireshark(1)(一个图形网络分析器),该应用程序设置为将命名管道作为输入读取。
在某些系统上,可以使用进程替换来简化两台机器之间的数据传输。执行进程替换只需要一行代码。
$ wireshark -k -i <( ssh -fq -i /home/fred/.ssh/key_rsa \
'sudo tcpdump -lqi eth0 -w - "not port 22"' )
但是,进程替换不符合 POSIX 标准,因此不能跨平台移植。它仅限于 bash(1),在其他 shell 中不存在。因此,为了实现可移植性,请使用命名管道。
有几种不同的方法可以使远程机器上的进程保持运行状态。如果目的是回到进程并定期检查它,那么终端多路复用器可能是最佳选择。对于更简单的需求,还有其他方法。
许多例行任务可以在后台启动,然后让它们自行完成,而无需保持登录状态。在后台运行远程进程时,最好为该任务专门启动一个 shell。
$ ssh -t -l fred server.example.org 'sh -c "tar zcf /backup/usr.tgz /usr/" &'
另一种方法是使用终端多路复用器。使用它们的一个优点是可以重新连接并定期跟踪进度,或者在连接中断(例如在旅行时)时简单地恢复正在进行的工作。这里,tmux(1) 重新连接到现有会话,或者如果没有现有会话,则创建一个新会话。
$ ssh -t -l fred server.example.org "tmux a -d || tmux"
在较旧的系统上,screen(1) 通常可用。这里,它在远程启动以创建新的会话(如果不存在),或重新连接到现有会话(如果正在运行)。因此,如果没有正在运行的 screen(1) 会话,将创建一个新会话。
$ ssh -t -l fred server.example.org "screen -d -R"
当一个 screen(1) 会话运行时,可以将其分离并关闭 SSH 连接,而不会影响它可能正在运行的后台进程。这在远程机器上托管某些游戏服务器时特别有用。然后可以使用相同的两个选项重新连接正在进行的终端会话。
$ ssh -t -l fred server.example.org "screen -d -R"
关于使用终端多路复用器 tmux(1) 或下面的内容还有更多信息。在某些环境中,可能还需要使用 pagsh(1),尤其是在使用 Kerberos 时,请参见下文。或者 nohup(1) 可能有用。
断开连接后为远程进程保留身份验证票证
[edit | edit source]身份验证凭据通常在注销时被删除,因此任何剩余的进程不再能够访问使用身份验证令牌进行的任何操作。在这种情况下,需要先创建一个新的凭据缓存沙箱,以便在断开连接之前在其中运行独立进程。
$ pagsh
$ /usr/local/bin/a-slow-script.sh
Kerberos 和 AFS 是两种需要有效、活动票证的服务示例。使用 pagsh(1) 是这些环境的一种解决方案。
使用 tmux(1) 或 screen(1) 自动重新连接和恢复 SSH 会话
[edit | edit source]使用终端多路复用器,可以在有意或意外中断后恢复活动的运行会话。这里假设 ssh(1) 在无法连接到服务器的 15 秒(每次尝试 5 秒,共 3 次)后断开连接并退出。然后重新连接 tmux(1) 会话,或者如果不存在则创建该会话。
$ while ! ssh -t [email protected] -o 'ServerAliveInterval 5' \
'tmux attach -d || tmux new-session'; \
do true; \
done
然后每次 ssh(1) 退出时,shell 都会尝试再次连接,并且当连接成功时,会寻找要连接的 tmux(1) 会话。这样,如果 TCP 或 SSH 连接断开,终端多路复用器内部的任何应用程序或会话都不会停止运行。以下是一个在旧系统上使用 screen(1) 的示例。
$ while ! ssh -t [email protected] -o 'ServerAliveInterval 5' \
'screen -d -R'; \
do true; \
done
上面的示例只是展示了过分简单的演示,它们在最基本的情况下有助于在 TCP 连接断开后恢复 shell 的位置。 tmux(1) 和 screen(1) 都有更强大的功能,值得探索,尤其是对于旅行者和远程工作人员。
另请参阅有关“公钥身份验证”的部分,了解如何将密钥集成到自动重新连接过程中。
共享远程 shell
[edit | edit source]教学、团队编程、监督和创建文档都是两个用户共享 shell 的一些示例。有一些选项可用于只读查看,以及多个用户读写。
只读监控或日志记录
[edit | edit source]管道和重定向是保存 SSH 会话输出或允许其他用户只读跟踪的快速方法。
一个示例用例是当路由器需要重新配置并且可以通过串行控制台访问时。假设路由器已关闭,并且顾问必须通过另一个用户的笔记本电脑连接登录以访问路由器的串行控制台,并且需要监督执行的操作或在某些阶段提供帮助。这在记录各种活动(包括配置或安装)方面也非常有用。
使用 tee(1) 进行只读
[edit | edit source]将 shell 活动捕获到日志文件,并选择使用 tail 实时监视它。实用程序 tee(1)(就像管道中的 T 形接头一样)用于将输出发送到两个目的地,即 stdout 和文件。
$ ssh [email protected] | tee /tmp/session.log
可以使用 tail(1) 实时监视生成的文件,或者事后使用分页器(如 less(1))监视。
使用 tee(1) 强制串行会话并进行远程日志记录
[edit | edit source]实用程序 tee(1) 可以捕获来自任何可以写入 stdout 的程序的输出。它非常适合引导远程站点的人员完成流程、监督或构建文档。
本示例使用 chroot(8) 来尽可能限制操作选择。实际上构建 chroot 监狱是一个单独的任务。构建完成后,guest 用户将成为“consult”组的成员。测试的串行连接位于设备 ttyUSB0 上,这是一个 USB 到串行转换器,cu(1) 用于连接。 tee(1) 获取来自 cu(1) 的输出,并在使用程序时将副本保存到文件中以进行日志记录。以下是将放在 sshd_config(5) 中的内容
Match Group consult
ChrootDirectory /var/chroot-test
AllowTCPForwarding no
X11Forwarding no
ForceCommand cu -s 19200 -l /dev/ttyUSB0 | tee /var/tmp/cu.log
这样,一个或多个用户就可以使用 tail(1) 跟踪 cu(1) 中发生的活动,方法是将其指向远程服务器上的日志文件。
$ tail -f /var/tmp/cu.log
或者可以编辑日志并用于文档。 tmux(1) 或 screen(1) 的高级用户也可以允许只读观察者。
脚本
[edit | edit source]可以自动化一些连接。创建一个脚本,例如 /usr/local/bin/screeners,然后使用 ForceCommand 指令使用该脚本。以下是一个尝试重新连接到现有会话的脚本示例。如果不存在任何会话,则创建一个新会话并自动建立与串行设备的连接。
#!/bin/sh
# try attaching to an existing screen session,
# or if none exist, make a new screen session
/usr/bin/screen -d -R || \
/usr/bin/screen \
/bin/sh -c "/usr/bin/cu -s 19200 -l /dev/ttyUSB0 | \
/usr/bin/tee /tmp/consultant.log"
使用终端多路复用器进行交互式共享
[edit | edit source]终端多路复用器 tmux(1) 或 screen(1) 可以将两个或更多用户连接到同一个会话。[1] 会话可以对某些用户只读,也可以对所有参与者读写。
tmux(1)
[edit | edit source]如果同一个帐户将共享会话,那么这非常容易。在第一个终端中,启动 tmux(1),其中“sessionname”是会话名称
$ tmux new-session -s sessionname
然后在第二个终端中
$ tmux attach-session -t sessionname
如果同一个帐户从不同的位置登录并共享会话,那么这些操作就足够了。对于不同的用户,您必须设置 tmux(1) 套接字的权限,以便两个用户都可以读取和写入它。这将首先需要一个包含两个用户的组。
然后,在两个帐户都加入共享组后,在第一个终端(包含主帐户的终端)中,启动 tmux(1),就像之前一样,但还要为会话的套接字分配一个名称。这里“sessionname”是会话名称,“sharedsocket”是套接字的名称
$ tmux -S /tmp/shareddir/sharedsocket new-session -s sessionname
然后将套接字和套接字目录的组更改为两个用户共享的组。确保套接字权限允许该组写入套接字。在此示例中,共享组为“foo”,套接字为 /tmp/shareddir/sharedsocket。
$ chgrp foo /tmp/shareddir/
$ chgrp foo /tmp/shareddir/sharedsocket
$ chmod u=rwx,g=rx,o= /tmp/shareddir/
$ chmod u=rw,g=rw,o= /tmp/shareddir/sharedsocket
最后,让第二个帐户登录并使用共享套接字连接到指定的会话。
$ tmux -S /tmp/shareddir/sharedsocket attach-session -t sessionname
此时,两个帐户都可以读取和写入同一个会话。
如果同一个帐户要共享一个 screen(1) 会话,那是一个简单的过程。在一个终端中,启动一个新会话并为其分配一个名称。在这个例子中,'sessionname' 是会话的名称。
$ screen -S sessionname
在另一个终端中,连接到该会话。
$ screen -x sessionname
如果两个不同的帐户要共享同一个 screen(1) 会话,则需要执行以下额外步骤。第一个用户在启动会话时执行此操作。
$ screen -S sessionname
^A :multiuser on
^A :acladd user2
然后第二个用户执行此操作。
$ screen -x user1/sessionname
在 screen(1) 中,如果使用多个用户帐户,则可以使用 aclchg
命令来删除其他用户的写入权限:^A :aclchg user -w "#"
。请注意, screen(1) 必须以 SUID 方式运行才能支持多用户。如果未设置,您在尝试连接第二个用户时将收到提醒错误消息。您可能还需要将 /var/run/screen 的权限设置为 755。
可以通过转发 X11(X 窗口系统的当前实现)来在远程机器上运行图形程序并将其在本地显示。X11 用于在许多系统上提供图形界面。请参阅网站 www.X.org 以了解其历史和技术细节。它内置在大多数桌面操作系统中。它甚至作为 Macintosh OS X 的一部分进行分发,尽管它不是默认的图形显示方法。
X11 转发默认情况下处于关闭状态,如果要使用它,则必须在 SSH 客户端和服务器上都启用它。
X11 还使用客户端-服务器架构,X 服务器是为最终用户执行实际显示的部分,而各种程序充当客户端并连接到服务器。因此,通过将客户端和服务器放在不同的机器上并转发 X11 连接,可以在其他计算机上运行程序,但将其显示和使用起来就像它们在用户自己的计算机上一样。
需要注意的是,允许远程机器转发 X11 连接将允许它及其应用程序访问托管 X 服务器的机器上的许多设备和资源。无论用户的意图如何,这些都是用户帐户可以访问的设备和其他资源。因此,只有在另一台机器、该用户帐户及其应用程序可靠的情况下才应进行转发。
在服务器端,要默认启用 X11 转发,请将以下行添加到 sshd_config(5) 中,无论是在主块中还是在 Match 块中。
X11Forwarding yes
在客户端侧,X11 的转发默认情况下也是关闭的,但可以使用三种不同的方法启用它。可以在 ssh_config(5) 中启用,或者使用 -X 或 -Y 运行时参数启用。
$ ssh -l fred -X desk.example.org
但是,连接速度会很慢。如果响应速度是一个因素,则可能需要考虑使用 SOCKS 代理或其他技术,例如 FreeNX。
可以通过配置 ssh_config(5) 在 /etc/ssh_config 中为所有帐户的所有传出 SSH 连接启用 X11 转发,或者仅为特定主机启用。
X11Forwarding yes
可以将 ssh_config(5) 设置应用于 ~/.ssh/config 中的单个帐户,以限制默认情况下通过主机名或 IP 号码对单个主机的转发。
Host desk.example.org
X11Forwarding yes
这里它通过 IP 号码为特定机器启用。
Host 192.168.111.25
X11Forwarding yes
同样,使用受限的模式匹配来允许为子域或 IP 地址范围转发。这里它为 pool.example.org 域中的任何主机、从 192.168.100.100 到 192.168.100.109 的任何主机以及从 192.168.123.1 到 199.168.123.254 的任何主机启用。
Host *.pool.example.org
X11Forwarding yes
Host 192.168.100.10?
X11Forwarding yes
Host 192.168.123.*
X11Forwarding yes
再次强调,X11 内置在大多数桌面系统中。OS X 还有一个可选的附加组件,其根源来自 NextStep。但是,一些特别过时、传统的平台可能缺少 X11 支持。但即使在那里,也通常可以使用合适的工具进行改装,例如 Xming 工具。
可以在高端口上使用无特权帐户运行 sshd(8)。它将无法派生到其他帐户,因此登录只能在运行无特权服务的同一帐户上进行。
在正常、无特权帐户上运行无特权 SSH 服务通常需要三个步骤。
1) 在无特权帐户下启动 SSH 守护程序之前,必须创建一些无特权主机密钥。这些密钥将用于向连接的客户端识别此服务,尤其是在回访时。它们的创建只需要对每个帐户进行一次,并且必须将密码留空。
$ ssh-keygen -q -t ed25519 -N '' \
-f /home/fred/.ssh/ssh_host_key_ed25519 \
-C 'unprivileged SSH host key for fred'
如果需要,对 ECDSA 和 RSA 密钥也进行同样操作。确保权限正确。密钥所在的目录及其父目录不应被其他帐户写入,并且私有 SSH 主机密钥本身也不应被任何其他帐户读取。
2) 当密钥就位后,通过手动启动 SSH 服务器来测试它们。一种方法是使用 -h 选项来指向这些备用主机密钥文件。请注意,由于帐户没有特权,因此只有从 1024 开始的端口可用,在这个例子中,使用 -p 选项设置端口 2222。
$ /usr/sbin/sshd -D \
-h /home/fred/.ssh/ssh_host_key_ed25519 \
-h /home/fred/.ssh/ssh_host_key_ecdsa -p 2222
验证从另一个系统是否可以访问新服务。尤其要确保任何包过滤器(如果存在)都设置为通过正确的端口。传入连接和任何包过滤器都必须在正常使用中考虑备用端口。另一种方法是将无特权 SSH 服务添加为洋葱服务。有关这方面的信息,请参阅关于代理和跳跃主机的章节。
请注意,以上示例使用守护程序的默认配置文件。如果需要不同的配置文件用于特殊设置,则将 -f 选项添加到公式中。
$ /usr/sbin/sshd -D -f /home/fred/.ssh/sshd_config
可以使用备用配置文件为无特权帐户设置特定配置指令。可以在该文件中识别无特权主机密钥,以及指定的备用监听端口和许多其他自定义项。通过将 SyslogFacility 指令更改为除 AUTH 之外的其他值,可能还有助于将无特权服务与同一系统上已有的任何其他 SSH 服务分别记录下来,AUTH 是默认值。
3) 自动化启动(如果这是目标)。
-D 选项使进程不会分离并成为守护程序。在测试期间,这可能很有用,但在实际使用中可能并非如此,这取决于进程的启动方式。
由于使用的是无特权帐户,因此不会发生特权分离,所有子进程将在与原始 sshd(8) 进程相同的帐户中运行。以下是在无特权帐户下监听端口 2222 以接收传入连接的示例,该示例使用默认配置文件并包含一些覆盖项。
$ pgrep -d , sshd | COLUMNS=200 xargs ps -w -o user,pid,args -p
USER PID COMMAND
fred 1997992 sshd: /usr/sbin/sshd -h /home/fred/.ssh/ssh_host_key_ed25519 -h /home/fred/.ssh/ssh_host_key_ecdsa -p 2222 [listener] 0 of 10-100 startups
然后,一旦有人连接但尚未完成登录,它可能看起来像这样。会派生一个监视器,但即使它被标记为 [priv],它也没有特权,而是仍然在与父进程相同的无特权帐户中运行。它反过来会派生一个子进程(这里为进程 1998150)来管理身份验证。
$ pgrep -d , sshd | COLUMNS=200 xargs ps -w -o user,pid,args -p
USER PID COMMAND
fred 1997992 sshd: /usr/sbin/sshd -h /home/fred/.ssh/ssh_host_key_ed25519 -h /home/fred/.ssh/ssh_host_key_ecdsa -p 2222 [listener] 1 of 10-100 startups
fred 1998149 sshd: fred [priv]
fred 1998150 sshd: fred [net]
最后,一旦登录成功,该无特权进程就会被丢弃,并且会启动一个新的无特权进程来管理交互式会话。
$ pgrep -d , sshd | COLUMNS=200 xargs ps -w -o user,pid,args -p
USER PID COMMAND
fred 1997992 sshd: /usr/sbin/sshd -h /home/fred/.ssh/ssh_host_key_ed25519 -h /home/fred/.ssh/ssh_host_key_ecdsa -p 2222 [listener] 0 of 10-100 startups
fred 1998149 sshd: fred [priv]
fred 1998410 sshd: fred@pts/20
在上面,进程 1998410 正在管理交互式会话。
受限 Shell 设置的环境比标准交互式 Shell 提供的环境更受控制。尽管它的行为与标准 Shell 几乎相同,但在许多情况下它对已列入白名单的功能存在限制,而其他功能则被禁用。这些限制包括但不限于以下内容。
- SHELL、ENV 和 PATH 变量不可更改。
- 程序不能使用绝对路径或相对路径运行。
- 不能使用创建文件的重定向(特别是 >、> |、>>、<>)。
常见的顶级 Shell(如 bash(1)、ksh(1) 和 zsh(1))都可以以受限模式启动。请参阅各个 Shell 的手册页以了解如何调用限制的详细信息。
即使有上述限制,仍然可以通过多种方法轻松地从受限 shell 中逃脱:如果路径中任何地方都提供正常的 shell,则可以启动它们。如果可用路径中的常规程序提供到完整 shell 的 shell 逃逸,则也可以使用它们。最后,如果sshd(8)配置为允许任意程序独立于 shell 运行,则可以启动一个完整的 shell。因此,安全使用受限 shell 的内容不仅仅是将帐户的 shell 设置为/bin/rbash
,然后就万事大吉。需要采取一些步骤来尽可能地使逃脱限制变得困难,尤其是在 SSH 上。
(以下步骤假设您熟悉适当的系统管理工具及其使用方式。此处未涵盖其选择和使用。)
首先,创建一个包含一些指向白名单程序的符号链接的目录。这些链接指向该帐户在将目录添加到 PATH 环境变量后应该能够运行的程序。这些程序不应具有任何 shell 逃逸功能,并且显然,它们本身不应该是不受限制的 shell。
如果您想阻止对系统进行大范围探索,请记住将用户锁定在 chroot 或 jail 中。即使没有 ls(1) 和 cat(1) 等程序,仍然可以进行探索(请参阅下文:“在没有 ls(1) 和 cat(1) 的情况下进行探索的方法”。
使用符号链接是因为原始文件(希望)由包管理软件维护,不应移动。如果原始目录和白名单目录位于不同的文件系统中,则不能使用硬链接。如果您设置了排除原始文件的 chroot 或 jail,则需要使用硬链接。
$ ls -l /usr/local/rbin/
total 8
lrwxr-xr-x 1 root wheel 22 Jan 17 23:08 angband -> /usr/local/bin/angband
lrwxr-xr-x 1 root wheel 9 Jan 17 23:08 date -> /bin/date
-rwxr-xr-x 1 root wheel 2370 Jan 17 23:18 help
lrwxr-xr-x 1 root wheel 12 Jan 17 23:07 man -> /usr/bin/man
lrwxr-xr-x 1 root wheel 13 Jan 17 23:09 more -> /usr/bin/more
lrwxr-xr-x 1 root wheel 28 Jan 17 23:09 nethack -> /usr/local/bin/nethack-3.4.3
...
接下来,为该帐户创建一个最小的.profile。将其所有者设置为“root”。也对其父目录(即用户的家目录)执行此操作。然后,允许该帐户所属的组读取文件和目录。
$ cd /home/fred
$ cat .profile
PATH=/usr/games:/usr/local/rbin
export PATH HOME TERM
$ ls -ld . .profile
drwxr-xr-x 3 root fred 512 Jan 17 23:20 .
-rw-r--r-- 1 root fred 48 Jan 17 23:20 .profile
接下来,为锁定的帐户创建一个组,并将其填充。此处,该帐户位于games组中,将通过其在此组中的成员身份进行限制。
$ groups fred
fred games
接下来,通过在服务器配置中使用ForceCommand指令锁定该组或帐户的 SSH 访问权限,并将其应用于所选组。这对于防止通过 SSH 客户端直接调用 shell(例如使用ssh -t [email protected] /bin/sh
或类似方法)来轻松规避限制是必要的。请记住,如果不需要,请禁用转发。例如,以下内容可以附加到sshd_config(5),以便“games”组中的任何帐户无论使用 SSH 客户端尝试什么操作,都会获得受限 shell。
Match Group games
X11Forwarding no
AllowTcpForwarding no
ForceCommand rksh -l
请注意,ForceCommand使用-l选项调用受限 shell,使其成为登录 shell,如果存在且可读,则会读取和执行/etc/profile和$HOME/.profile中的内容。这对于设置自定义 PATH 环境变量是必要的。同样,请确保受限帐户无法以任何方式编辑或覆盖$HOME/.profile。还要注意,这会禁用该帐户的 SFTP 访问权限,从而阻止许多其他恶意行为。
最后但并非最不重要的一点是,将帐户的登录 shell 设置为受限 shell。请包含受限 shell 的完整路径。可能还需要先将其添加到/etc/shells中找到的已批准 shell 列表中。
注意:在没有 ls(1) 和 cat(1) 的情况下进行探索的方法
[edit | edit source]# To see a list of files in the current working directory:
$ echo *
# To see the contents of a text file:
$ while IFS= read -r j; do echo "$j"; done < .profile
参考资料
[edit | edit source]- ↑ "与 Tmux 和 Screen 共享终端会话". HowToForge. 2012.