我有越来越多的远程机器通过 ssh 回家并建立连接以允许后续通过隧道访问,这样我就可以进入它们进行维护。
目前,我必须通过编辑脚本在远程位置安装之前手动为这些机器配置一个唯一的转发 ssh 端口。其余的安装都是自动的 (PXE)。手动设置这个端口很麻烦 (而且有出错的风险),让我无法自信地将整个过程交给技术人员。
问题> 给定一个干净的 Debian 安装,是否可以编写一个数字哈希函数(例如)eth0 上的 mac 地址,该函数将是确定性的并且落在某个范围内(例如 30000-60000),然后你可以合理地期望是独一无二的(++)。我想我有 bash、awk 等可以玩。如果可能的话,我更愿意坚持使用与 shell 相关的工具,但如果有必要,我也可以使用 python。
(++) 如果第一个尝试的端口出现问题,我会修改隧道脚本来增加端口。
建议输入示例:ifconfig eth0 | grep HWaddr | awk'{打印$ 5}'== 08:00:27:aa:bb:cc
所需输出示例: 34567
答案1
您的 hwaddr 只是一个大数字,因此您可以始终使用该 mod 来获取范围并添加偏移量。
#!/usr/bin/perl
$iface = $ARGV[0] || "eth0";
open(IFCONFIG, "-|") || exec "/sbin/ifconfig", $iface;
while (<IFCONFIG>) {
if (/HWaddr ([0-9a-f:]{17})/i) {
($hwaddr = $1) =~ s/://g;
$hwint = hex($hwaddr);
print $hwint % 30000 + 30000, "\n";
}
}
close(IFCONFIG);
这是 Math::BigInt 版本:
#!/usr/bin/perl -w
use Math::BigInt;
$iface = $ARGV[0] || "eth0";
open(IFCONFIG, "-|") || exec "/sbin/ifconfig", $iface;
while (<IFCONFIG>) {
if (/HWaddr ([0-9a-f:]{17})/i) {
($hwaddr = $1) =~ s/://g;
$hwint = Math::BigInt->new("0x" . $hwaddr);
print $hwint % 30000 + 30000, "\n";
}
}
close(IFCONFIG);
答案2
这也应该可以完成所需的工作。
port=$(/sbin/ifconfig eth0 | grep HWaddr | awk '{ print $5 }' | md5sum | cut -d ' ' -f1)
port=${port:25}
let "port = 0x$port"
let "port %= 30000"
let port="$port + 30000"
echo $port
答案3
我真的很喜欢你的想法,而且我很好奇想看看你的隧道脚本,但我内心的愤世嫉俗者说有人会提到 SSH 密钥:-)
我们仅将其用于cssh
许多小的外壳窗口。