Linux rexec 命令介绍
rexec(remote execute 的缩写),用于在指定的远程 Linux 系统主机上执行命令,向远程 rexec 服务器发出执行命令的请求。rexec 命令提供了一个自动登录的功能,通过检查 $HOME/.netrc 文件,该文件包含了远程主机上使用的用户名和密码。如果没有找到这样的条目,或者系统在安全模式下操作(参见 securetcpip 命令),rexec 命令会提示输入一个远程主机的有效用户名和密码。在这两种情况下,rexec 会导致远程系统上的 rexecd 为用户使用默认的 compat 登录认证方法。rexecd 不会查看远程系统上的 /etc/security/user 文件,以寻找其他的认证方法。您也可以通过指定 -n 参数来覆盖自动登录的功能。
Linux rexec 命令适用的 Linux 版本
rexec 命令适用于大多数 Linux 发行版,如 Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、RedHat/CentOS、Fedora、Raspbian 等。如果某些 Linux 版本没有预装 rexec 命令,可以通过安装 rsh-client 或 rsh-redone-client 包来解决。例如,在 Debian 或 Ubuntu 上,可以使用以下命令来安装:
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install rsh-client
或者
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install rsh-redone-client
在 RedHat/CentOS 7 上,可以使用以下命令来安装:
[linux@bashcommandnotfound.cn ~]$ sudo yum install rsh
在 RedHat/CentOS 8 上,可以使用以下命令来安装:
[linux@bashcommandnotfound.cn ~]$ sudo dnf install rsh
Linux rexec 命令的基本语法
rexec 命令的基本语法格式如下:
rexec [ -a ] [ -d | -n] [ -i] HostCommand
其中,Host 是指定的远程主机的名称,Command 是要在远程主机上执行的命令,包括任何参数或选项。
Linux rexec 命令的常用选项或参数说明
rexec 命令的常用选项或参数说明如下表所示:
选项或参数 | 说明 |
---|---|
-a | 指定远程命令的标准错误和标准输出是相同的 |
-d | 指定在远程主机上执行命令时,将当前目录设置为用户的主目录 |
-n | 阻止自动登录,即使在 $HOME/.netrc 文件中有相同的远程主机名的条目 |
-i | 指定在远程主机上执行命令时,忽略中断信号 |
Linux rexec 命令实例详解
下面给出一些 rexec 命令的实例,以帮助您更好地理解和使用该命令。
实例1:在远程主机上执行 date 命令
如果您想在远程主机 host1 上执行 date 命令,并在本地主机上显示输出,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec host1 date
如果您在本地主机的 HOME/.netrc 文件中有一个有效的用户名和密码,用于登录远程主机 host1,那么该命令会直接执行,并显示 date 命令的输出。如果您没有在 HOME/.netrc 文件中有一个有效的条目,那么该命令会提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 date 命令的输出。
实例2:覆盖自动登录功能
如果您想覆盖自动登录功能,并在远程主机 host1 上执行 date 命令,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec -n host1 date
该命令会忽略 $HOME/.netrc 文件中的任何条目,而是提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 date 命令的输出。
实例3:在远程主机上执行 ls 命令
如果您想在远程主机 host1 上执行 ls 命令,并显示指定目录的内容,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec host1 ls -l /home/karen
该命令会在远程主机 host1 上执行 ls -l /home/karen 命令,并在本地主机上显示输出。如果您在本地主机的 HOME/.netrc 文件中有一个有效的用户名和密码,用于登录远程主机 host1,那么该命令会直接执行,并显示 ls 命令的输出。如果您没有在 HOME/.netrc 文件中有一个有效的条目,那么该命令会提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 ls 命令的输出。
实例4:在远程主机上执行 ps 命令
如果您想在远程主机 host1 上执行 ps 命令,并显示所有进程的信息,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec host1 ps -ef
该命令会在远程主机 host1 上执行 ps -ef 命令,并在本地主机上显示输出。如果您在本地主机的 HOME/.netrc 文件中有一个有效的用户名和密码,用于登录远程主机 host1,那么该命令会直接执行,并显示 ps 命令的输出。如果您没有在 HOME/.netrc 文件中有一个有效的条目,那么该命令会提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 ps 命令的输出。
实例5:在远程主机上执行 ping 命令
如果您想在远程主机 host1 上执行 ping 命令,并测试与另一个主机 host2 的连通性,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec host1 ping -c 4 host2
该命令会在远程主机 host1 上执行 ping -c 4 host2 命令,并在本地主机上显示输出。如果您在本地主机的 HOME/.netrc 文件中有一个有效的用户名和密码,用于登录远程主机 host1,那么该命令会直接执行,并显示 ping 命令的输出。如果您没有在 HOME/.netrc 文件中有一个有效的条目,那么该命令会提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 ping 命令的输出。
实例6:在远程主机上执行 who 命令
如果您想在远程主机 host1 上执行 who 命令,并显示当前登录的用户,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec host1 who
该命令会在远程主机 host1 上执行 who 命令,并在本地主机上显示输出。如果您在本地主机的 HOME/.netrc 文件中有一个有效的用户名和密码,用于登录远程主机 host1,那么该命令会直接执行,并显示 who 命令的输出。如果您没有在 HOME/.netrc 文件中有一个有效的条目,那么该命令会提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 who 命令的输出。
实例7:在远程主机上执行 top 命令
如果您想在远程主机 host1 上执行 top 命令,并显示系统的资源使用情况,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec host1 top
该命令会在远程主机 host1 上执行 top 命令,并在本地主机上显示输出。如果您在本地主机的 HOME/.netrc 文件中有一个有效的用户名和密码,用于登录远程主机 host1,那么该命令会直接执行,并显示 top 命令的输出。如果您没有在 HOME/.netrc 文件中有一个有效的条目,那么该命令会提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 top 命令的输出。
实例8:在远程主机上执行 df 命令
如果您想在远程主机 host1 上执行 df 命令,并显示磁盘的使用情况,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec host1 df -h
该命令会在远程主机 host1 上执行 df -h 命令,并在本地主机上显示输出。如果您在本地主机的 HOME/.netrc 文件中有一个有效的用户名和密码,用于登录远程主机 host1,那么该命令会直接执行,并显示 df 命令的输出。如果您没有在 HOME/.netrc 文件中有一个有效的条目,那么该命令会提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 df 命令的输出。
实例9:在远程主机上执行 uname 命令
如果您想在远程主机 host1 上执行 uname 命令,并显示系统的信息,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec host1 uname -a
该命令会在远程主机 host1 上执行 uname -a 命令,并在本地主机上显示输出。如果您在本地主机的 HOME/.netrc 文件中有一个有效的用户名和密码,用于登录远程主机 host1,那么该命令会直接执行,并显示 uname 命令的输出。如果您没有在 HOME/.netrc 文件中有一个有效的条目,那么该命令会提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 uname 命令的输出。
实例10:在远程主机上执行 curl 命令
如果您想在远程主机 host1 上执行 curl 命令,并下载一个网页的内容,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ rexec host1 curl -o index.html https://www.bashcommandnotfound.cn
该命令会在远程主机 host1 上执行 curl -o index.html https://www.bashcommandnotfound.cn 命令,并在本地主机上显示输出。如果您在本地主机的 HOME/.netrc 文件中有一个有效的用户名和密码,用于登录远程主机 host1,那么该命令会直接执行,并显示 curl 命令的输出。如果您没有在 HOME/.netrc 文件中有一个有效的条目,那么该命令会提示您输入用户名和密码。在您输入正确的登录信息后,该命令会执行,并显示 curl 命令的输出。该命令会在远程主机 host1 上的当前目录下创建一个名为 index.html 的文件,该文件包含了 https://www.bashcommandnotfound.cn 网页的内容。
Linux rexec 命令的注意事项
使用 rexec 命令时,需要注意以下几点:
- rexec 命令需要远程主机上运行 rexecd 守护进程,该进程通常在 /etc/inetd.conf 文件中配置。如果远程主机没有启动 rexecd 守护进程,那么 rexec 命令会失败,并显示类似于以下的错误信息:
[linux@bashcommandnotfound.cn ~]$ rexec host1 date
rexec: host1: Connection refused
为了解决这个问题,您需要在远程主机上编辑 /etc/inetd.conf 文件,取消 rexecd 一行的注释,并重启 inetd 服务。例如,在 Debian 或 Ubuntu 上,可以使用以下命令来编辑 /etc/inetd.conf 文件:
[linux@bashcommandnotfound.cn ~]$ sudo nano /etc/inetd.conf
然后,找到以下一行,并删除 # 号:
#exec stream tcp nowait root internal
保存并退出文件,然后使用以下命令来重启 inetd 服务:
[linux@bashcommandnotfound.cn ~]$ sudo service inetd restart
在 RedHat/CentOS 上,可以使用以下命令来编辑 /etc/xinetd.d/rexec 文件:
[linux@bashcommandnotfound.cn ~]$ sudo nano /etc/xinetd.d/rexec
然后,找到以下一行,并将 disable 的值改为 no:
disable = yes
保存并退出文件,然后使用以下命令来重启 xinetd 服务:
[linux@bashcommandnotfound.cn ~]$ sudo service xinetd restart
- rexec 命令使用明文传输用户名和密码,这可能会导致安全风险。为了避免这个问题,您可以使用更安全的 ssh 命令来代替 rexec 命令。ssh 命令使用加密的方式来连接远程主机,并执行命令。例如,如果您想在远程主机 host1 上执行 date 命令,并在本地主机上显示输出,可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ ssh host1 date
该命令会在远程主机 host1 上执行 date 命令,并在本地主机上显示输出。如果您在本地主机的 HOME/.ssh 目录中有一个有效的公钥和私钥,用于登录远程主机 host1,那么该命令会直接执行,并显示 date 命令的输出。如果您没有在 HOME/.ssh 目录中有一个有效的密钥对,那么该命令会提示您输入密码。在您输入正确的密码后,该命令会执行,并显示 date 命令的输出。
- rexec 命令可能会遇到 bash: rexec: command not found 的错误,这表示您的系统没有安装 rexec 命令。为了解决这个问题,您需要按照上面的 Linux rexec 命令适用的 Linux 版本 一节的方法,安装 rsh-client 或 rsh-redone-client 包,以获取 rexec 命令。
评论区