![rsh 显示“poll:电路设置中的协议失败”,为什么?](https://linux22.com/image/30059/rsh%20%E6%98%BE%E7%A4%BA%E2%80%9Cpoll%EF%BC%9A%E7%94%B5%E8%B7%AF%E8%AE%BE%E7%BD%AE%E4%B8%AD%E7%9A%84%E5%8D%8F%E8%AE%AE%E5%A4%B1%E8%B4%A5%E2%80%9D%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
在开始时,rsh 工作正常,但在进行一些更改后,它显示一些错误 [更改显示在这个问题的末尾,请参阅],我正在分享相同的内容。
命令
$ /usr/bin/rsh 本地主机 ulimit -n
输出
poll: protocol failure in circuit setup
面对这个问题后,我遵循这个链接,但没有得到任何帮助。
它工作正常,但是当我做了一些改变时,从此关联,然后它显示如上的输出。现在我恢复所有更改,但它显示相同的输出。为什么?
这些是我在文件中添加的行,通过查看上面的链接显示在左侧。
/etc/pam.d/login: session required pam_limits.so
/etc/pam.d/sshd: session required pam_limits.so
/etc/pam.d/su: session required pam_limits.so
/etc/pam.d/system-auth: session required pam_limits.so
这里是我正在尝试做的事情的链接。
编辑1号
strace -o log.txt rsh localhost pwd
,一些输出行如下,
connect(3, {sa_family=AF_INET, sin_port=htons(514), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
bind(4, {sa_family=AF_INET, sin_port=htons(1022), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(4, 1) = 0
write(3, "1022\0", 5) = 5
poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}], 2, -1) = 1 ([{fd=3, revents=POLLIN|POLLERR|POLLHUP}])
write(2, "poll: protocol failure in circui"..., 40) = 40
close(4) = 0
close(3) = 0
rt_sigprocmask(SIG_SETMASK, [], [URG], 8) = 0
exit_group(1)
编辑编号2
命令 - strace ~/rshd.trace in.rshd
输出
execve("/usr/sbin/in.rshd", ["in.rshd"], [/* 22 vars */]) = 0
brk(0) = 0x2b3054ec2000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b303671d000
uname({sys="Linux", node="jhamb.XXX.XXX", ...}) = 0
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b303671e000
arch_prctl(ARCH_SET_FS, 0x2b303671e6d0) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
答案1
rsh 是一个非常奇怪的协议,它有一个非常不寻常的问题(我认为非 PASV ftp 是我见过的唯一一个基于 TCP 的协议):打开与服务器的连接后,服务器必须打开一个返回客户端的 TCP 连接。这是因为 rsh 协议通过常规 TCP 连接返回标准输出,并通过这种奇怪的反向通道连接返回标准错误。
显然,在防火墙无处不在的今天,这种方法的效果非常非常差。我怀疑您和目标服务器之间的某些防火墙拒绝该反向通道连接。某些防火墙具有 rsh 协议状态跟踪来允许执行此操作,但即使可用,它通常也不会打开。
这(以及许多其他原因)是 rsh 消亡并且每个人都转向 ssh 的原因,ssh 具有设计得更好(尽管更复杂)的协议,可以通过同一连接复用多个输出流。
这就是为什么你的第一个链接说要关闭 iptables;它禁用了阻止反向通道连接的防火墙。
答案2
原因:
问题是多个 rsh 同时运行。
解决方案 :
重新启动 rsh ,
重新启动 xinetd 服务