远程网络命令

作者:Jens Hartmann

通常,连接到某种网络并不意味着您可以直接访问该网络提供的所有资源。一些设备,如磁带驱动器和打印机,连接到特定的计算机,并且只能在这些机器上访问。其他设备,如磁盘驱动器,如果系统管理员允许,则可以轻松访问。

随着网络规模的扩大,直接访问资源变得更加复杂。这部分是出于安全原因,部分是由于一个简单的事实,即需要说服更多的人你需要挂载磁盘,你成功的机会就越小。由此得出一条规则,可用资源越多,连接到这些资源通常就越困难。

一个绕过这种困境的简单而有效的方法是使用远程命令 rloginrcprsh。这些命令允许访问网络中任何计算机上您拥有的任何帐户,而无需使用密码。rcprlogin 可以与 ftp 和 telnet 相比较,而 rsh 提供了在一个 shell 管道中组合不同机器上的命令的可能性。

配置非常简单——事实上,您的主机网络可能已经正确配置——您可以立即访问这些功能。在本文中,我将介绍这些命令,解释本地设置,提供一些示例以帮助您入门,展示一些选项,并演示可以达到的复杂程度。我的大多数示例都可以轻松地在您的联网机器上复制。

设置

在正常情况下(您的网络已启动,您可以 telnet 到其他机器,并且可以被其他机器访问),您唯一需要做的是在您的主目录中创建一个名为 .rhosts 的文件,该文件只能由您自己读取和写入(模式 600)。此文件应包含您要从中登录的每台机器的完整主机名,以及该机器上的用户名,如下所示

apple.groucho.edu          fred
orange.groucho.edu              sam

.rhosts 文件指定了允许登录到 .rhosts 文件所在机器上的用户 的机器和用户。如果我以 sam 身份登录到 banana.groucho.edu 机器,并且我的主目录中有上述 .rhosts 文件,那么来自 orange.groucho.edu 的用户 sam 和来自 apple.groucho.edu 机器的用户 fred 可以远程访问我的帐户。

现在,我从我在 banana.groucho.edu 上的帐户登录到 apple.groucho.edu(用户名 fred)。从 apple.groucho.edu 我运行以下命令:rlogin banana.groucho.edu -l sam。登录后,shell 命令将像往常一样工作。

如果您被要求输入密码,请不要输入密码,而是快速切换回您在 banana.groucho.edu 上的原始登录并键入 ps -a。在进程列表中,您的 rlogin 请求应显示,并以其来源机器的名称作为参数。如果这与您在 .rhosts 文件中输入的名称不同,您将需要输入新名称。有时,机器使用不同的线路或公共服务器进行此类通信,即使其名称没有更改。如果仍然没有连接,您应该咨询系统管理员。有些机器根本不允许任何 rlogin 命令。

为了响应任何 rlogin 请求,您的 Linux 机器的 inetd.conf 应该有以下两行

shell   stream  tcp     nowait  root /usr/sbin/tcpd  /usr/sbin/in.rshd
login   stream  tcp     nowait  root /usr/sbin/tcpd  /usr/sbin/in.rlogind

当您是域的成员并共享用户名时,您可能希望将您经常连接的主机包含在 /etc/hosts.equiv 中。在这种情况下,您的 .rhosts 文件可能只包含昵称(通常只是不带域信息的机器名称)以及用户名。上面 banana.groucho.edu 机器上的 .rhosts 文件示例将如下所示

apple.groucho.edu               fred
orange                          sam
RCP

rcp 命令将文件或目录从一台机器复制到另一台机器。它的用法类似于 cp 命令。例如,我可以将名为 test.dat 的文件从远程机器 banana 复制到我的本地机器 orange。(要使此示例起作用,两台机器必须共享用户名。)

rcp banana:test.dat .

rcp banana.groucho.edu:test.dat .

文件 test.dat 位于 banana 上的我的主目录中,并被复制到 orange 上的当前目录。

如果我想将我的 Mail 目录及其内容复制到 orange 的 Mail.banana 目录中(同样,从 orange)

rcp -r banana:Mail Mail.banana

要保留时间戳,我应该键入

rcp -r -p banana:Mail Mail.banana

从我在 apple 上拥有不同帐户的机器 apple 进行远程复制

rcp fred@apple:test.dat test

当然,事情也可以反过来。这是一个到 apple 的远程副本

rcp test.dat fred@apple:test.dat

最后一个有趣的事情是从 apple 复制到 banana,当您登录到 banana 时。不幸的是,这在除我的 Linux 机器之外的所有其他机器上都有效

rcp fred@apple:test.dat banana:test.dat

您可以看到 rcp 比 ftp 更方便一些。

rlogin:

使用 rlogin,您可以执行到另一台机器的远程登录。它可以用来代替 telnet

rlogin orange

rlogin -l fred apple

rlogin  apple -l fred

(对于某些版本的 Unix)

我将每台机器都集成到我的窗口菜单中,使用 rlogin。这使得登录非常高效。例如,这里有两个描述——一个用于窗口管理器 fvwm,一个用于 olvwm——用于为到 orange 的 rlogin 添加菜单和快捷键。

Popup "Rlogin"
Title "Rlogin"
Exec "banana F1" xhost +banana;\
exec xterm -fn fixed -T banana -sb -e rlogin banana & EndPopup
Key F1  A N  Exec "banana" xhost +banana;\
exec xterm -fn fixed -T banana -sb -e rlogin banana &

对于 olvwm

"Login" MENU
"Rlogin" TITLE PIN
"banana"  xhost +banana; exec xterm -T banana\
-sb -e rlogin banana
"Login" END
rsh

rsh 命令是最强大的远程命令,因为它可以集成到管道中。这使您能够在不同的机器之间执行复杂的命令序列。没有任何命令时,rsh 会 rlogin 到另一台机器。当我登录到 orange 时

rsh banana
logs me remotely to banana, while:
rsh -l fred apple

在 apple 上执行相同的操作,其中用户名与我在 orange 上当前 shell 的用户名不同。

来自远程机器的 stdoutstderr 都通过管道传输到本地机器。建立连接后,不会扫描 /etc/profile.bash_profile(对于 bash)或 .login(对于 csh 和 tcsh)。这在开始时可能会令人困惑,因为并非所有您为登录 shell 定义为变量和别名的内容都存在。这与 rlogin 不同,后者为您提供真正的“登录 shell”。最常见的问题是您使用的命令找不到,因为路径变量未正确设置。在这些情况下,您可以在 shell 初始化文件中设置您的路径,例如 .bashrc.cshrc(但是,/bin/sh 没有这样的文件)。更通用的解决方案是简单地使用命令的完全限定路径名。

rsh 最简单的用法是一个简单的命令,例如

rsh banana ls

您应该从 banana 上的主目录中获得一个列表。如果您想使用以“ -”开头的选项,语法将是

rsh banana `ls -al'

引号之间的所有内容都在 banana 上执行。

列表已发送到您的本地 stdout,即您的屏幕,就像在本地(在 orange 上)执行了 ls 一样。以下是一些示例,说明如何从名为 bin 的目录在 banana 上创建 tar 存档,输出转到 stdout,存档文件放置在 orange 上

rsh banana `tar cf - bin' | dd of=archive.tar

rsh banana `tar cf - bin' > archive.tar

当然,这对于不同的用户名或在另一个方向也有效

rsh -l fred apple `tar cf - bin' > archive.tar       tar cf - bin | rsh -l
fred apple dd of=archive.tar

dd 命令在这里非常方便,因为它将 stdin 复制到 of 指定的文件中。如果我使用 > 重定向输出,我将再次在 orange 上结束,但我希望将文件写入 apple,dd 可以正确地做到这一点。

rsh 高级用法

现在来看一些示例,说明在哪些机器上会发生什么。从一些简单的开始

        ps -aux | grep root

这显示了 root 在您的本地机器上拥有的所有进程。下一个命令将显示 banana 上 root 拥有的所有进程。

        rsh banana `ps -aux' | grep root

在这种情况下,ps 命令在 banana 上执行,但 grep 在本地(在 orange 上)执行。

下一个命令执行相同的操作,不同之处在于 grep 命令在 banana 上执行,ps 命令也是如此。

rsh banana `ps -aux | grep root'

rsh banana `ps -aux' | rsh banana `grep root'

下一个示例展示了如何拆分 stderrstdout(这仅适用于 sh 或 bash,不适用于 csh 或 tcsh!)

 rsh banana `dd if=bin.tar 2>fehler' > test.dat

在这里,我们有 dd 将其错误输出写入 banana 上的文件 fehler,但将其标准输出传输到 orange 的文件 test.dat。这里的秘密在于引号的使用。因为 2>fehler 在引号内,所以它在 banana 上执行。事情可能会变得非常棘手。您不仅可以充分利用 shell 命令,还可以在不同的机器上运行它们

rsh banana `tar xf bin.tar `rsh banana `tar tf \ bin.tar' | grep gj2.c`'

这里我在 banana 上有一个 tar 存档 bin.tar。其中有一个名为 usr/local/src/gj2.c 的文件。首先,在 ` ... ` 之间有一个命令扩展。此扩展返回存档中包含字符串“gj2.c”的所有文件名。首先,tar tf 返回存档中的文件列表,然后 grep(在 orange 上运行)执行模式匹配。这产生 usr/local/src/gj2.cusr/local/src/gj2.c~。现在,第一个 tar (tar xf bin.tar) 在 banana 上提取这些文件。

想象一下,您有一个磁带驱动器连接到 banana,另一个连接到 orange。您想制作磁带的副本。

rsh banana dd if=/dev/rst0 ibs=1024 | dd \
of=/dev/rmt0 obs=1024

这里 /dev/rst0 是 banana 上的 SCSI 磁带驱动器,/dev/rmt0 是 orange 上的 SCSI 磁带驱动器。现在您想使用一个名为 demux 的特殊程序处理您的数据。

rsh banana dd if=/dev/rst0 ibs=1024 | demux | \
rsh banana dd of=file.dat

现在我们从 banana 读取,在 orange 上处理,然后写回 banana。

在下一个示例中,您想访问连接到 banana 的打印机。我们有一个 PostScript 文件 test.ps,我们想将其发送到名为 p_a4 的打印机上

dd if=test.ps | rsh banana `lpr -Pp_a4'

您可能想在打印文件之前查看一下

dd if=test.ps | rsh banana `xv - -display orange:0'

这仅在 X-windows 下有效。在 orange 上,您需要首先给出类似 xhost +banana 的命令。

问题

除了上面的一些示例可能无法在某些配置下运行之外,我还遇到了一些奇怪的行为。考虑一下,就像在前面的示例中一样,我们有两个相同的文件:banana 上的 bin.tar 和 orange 上的 bin.tar

ls | grep bin

响应是 bin.tar。以下情况也是如此

rsh banana ls | grep bin

但下一个命令会失败

ls | rsh banana grep bin

但是,使用 dd 命令将文件通过管道传输到远程 shell 从未失败过。

结论

借助这些命令,连接到其他机器变得容易得多。rcprlogin 命令几乎可以完全替代本地网络上的 ftptelnet 等命令。

最后,rsh 命令使您能够通过多台不同的机器生成数据流,访问本地磁盘和磁带驱动器(或您被允许访问的任何其他内容)。

Jens Hartmann (hartmann@dkrz.d400.de) 是汉堡大学的地球物理学家,他在工作中使用 Linux。

加载 Disqus 评论