我正在尝试linux ssh。在终端中,我尝试连接我正在使用的同一台 Linux 机器,并且它已连接!就像用您的手机拨打同一部电话一样!但这怎么可能呢?
以下是我输入的示例终端命令:
alpha@alpha:~$ ssh alpha@<my IP address>
alpha@<my IP address>'s password: <my password>
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-42-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
* Canonical Livepatch is available for installation.
- Reduce system reboots and improve kernel security. Activate at:
https://ubuntu.com/livepatch
0 packages can be updated.
0 updates are security updates.
Last login: Mon Dec 10 15:31:35 2018 from <my IP address>
上面的终端与我使用 ssh 的 Linux 机器的 IP 地址和上面的终端输出相同。我还注意到我可以在嵌套连接中使用 ssh 与同一台机器连接,并且我尝试了 5 级深度!
出于好奇,我问这个问题是为了知道这是正确的吗? linux 不能检测到它吗自言自语?
答案1
您的系统就像一座建筑物,而不是一部电话。
您可以向建筑物拨打多次电话。您可以呼叫大楼内的另一个人。
因此,当您 ssh 到同一台计算机时,它就会进行调用。然后接到电话。接收端不知道呼叫来自同一台机器,并且它会正确处理它。
它不会将其连接到同一 shell/命令行。 Unix 是一个多任务系统。如果它只能完成一项任务,那就有问题了。但它可以做很多事情。一台机器上可以有许多用户,他们都在做自己的事情。如果其中之一是自我,那也没关系。
答案2
在 Linux 中,您所做的每个连接通常最后都在 bash 上运行,对于其他 UNIX,则使用其他 shell(以及其他初始化脚本)
所以你可以使用当前的shell初始化脚本来配置连接行为的一个 ssh 客户端通过读取 ssh 客户端会话生成的环境变量。
例如,在 /etc/bash.bashrc 中,类似的内容可能会阻止您连接到自己。
CNIP=$(echo $SSH_CONNECTION | cut -d' ' -f1)
RNIP=$(echo $SSH_CONNECTION | cut -d' ' -f3)
if [ "$CNIP" == "$RNIP" ] && [ "$CNIP" != "" ] ; then
echo "We are connecting to ourself, exiting.."
exit 1
fi
所以在 Linux 中,用这个你可能会阻止 ssh 允许服务器 ip 本身的连接。
Linux/Unix 是非常可定制的,它可能允许你做一切事情,包括用无限循环破坏你的系统,如果你真的想要的话。因此,如果你想防止某些事情发生,你需要更加明确。
另一方面,我没有看到这种行为有任何问题,我无法确定你为什么担心它,但如果你真的想出于任何原因阻止,这里可能有一个解决方案。
答案3
很多时候,服务器与自身对话正是您所需要的。
甚至有时候,ssh
深入了解自己可能会很有用(不过,如果它通常是完成这项工作的最佳工具,我会感到惊讶)。
我感觉到你担心的一个问题是这可能会带来某种危险。
可以想象,它可能是 - 但不会比经典的叉子炸弹多很多:(){ :|:& };:
(在你的术语中不要这样做,除非你同意可能需要重新启动)
如果你要编写并执行一个脚本echo 'ssh localhost -c ". ~/.recursive_ssh" >> ~/recursive_ssh && . ~/recursive_ssh'
,可能会发生一些不好的事情(最好的情况是它ulimit
会来拯救你,并杀死炸弹)。
bash
这在功能上与在中执行没有太大区别bash
- 您可以尝试一下:
bash bash
只会给你一个正常的提示,不同的是你需要退出两次才能退出。
没有太多理由不想听localhost
,事实上,可能没有更安全的主持人可以交谈。
当然你可以做一些愚蠢的事情,比如无限递归到ssh
会话中,但你不需ssh
要这样做