我的服务器中配置了很多接口,每个接口都连接到特定的网卡并具有单独的路由表。这些接口可以通过“netstat -a”命令来识别。
现在,我想执行仅连接到特定接口的 rsync 命令。我有这个要求,因为每个接口都将通过一个单独的隧道/路径,我想要一个特定的 rsync 命令通过指定的隧道同步文件。
具体来说,我想要一种指定接口名称的方法。
谢谢,莫汉。
我的服务器中配置了很多接口,每个接口都连接到特定的网卡并具有单独的路由表。这些接口可以通过“netstat -a”命令来识别。
现在,我想执行仅连接到特定接口的 rsync 命令。我有这个要求,因为每个接口都将通过一个单独的隧道/路径,我想要一个特定的 rsync 命令通过指定的隧道同步文件。
具体来说,我想要一种指定接口名称的方法。
谢谢,莫汉。
您可以--address=x.x.x.x
在命令行上使用指定接口的地址。
我认为没有任何方法可以直接指定接口,但是该ip
命令可以告诉您接口的地址,因此您可以使用以下内容:
IP=$(ip -4 -br addr show eth0 | awk '{split($3,a,"/"); print a[1]}')
rsyncd ... --address=$IP
我编写了这个小 perl 脚本来将接口名称转换为地址,将其保存为iftoip
(或类似的)
#!/usr/bin/perl
use strict;
use warnings;
use IO::Interface::Simple;
use feature qw(say);
my $iface = shift;
my $if = IO::Interface::Simple->new($iface) or die "$!: $iface";
say $if->address;
exit 0;
你可以用 bash 做类似的事情:
iftoip() {
ip addr show $1 | grep inet | awk '{print $2}' | cut -d'/' -f1
}
只需将以上 3 行添加到~/.bashrc
并启动一个新的 shell 或source ~/.bashrc
运行它会产生:
v@juno:~$ iftoip ens33
10.251.17.94
v@juno:~$ iftoip ens34
192.168.78.128
v@juno:~$ echo "IP=$(iftoip ens33)"
IP=10.251.17.94
v@juno:~$ iftoip ens35 #perl
No such device: ens35 at /home/v/bin/iftoip line 10.
或者
v@juno:~$ iftoip ens35 #bash
Device "ens35" does not exist.
这已经尝试使用 2 个接口,具有不同的子网并且有效。
rsync -avzP -e 'ssh -b 10.100.16.X' /var/tmp/ent1 10.100.16.X:/var/tmp/;
rsync -avzP -e 'ssh -b 10.100.20.X' /var/tmp/ent2 10.100.20.X:/var/tmp/ ;
从客户端到服务器,通过 ssh 使用:
rsync -avP -e 'ssh -b x.x.x.x' tmp/ server:tmp/