希望有人能在这里帮助我。希望重做我的 cisco 设备 bash ssh 脚本,并添加内容。基本上,我的想法是使用 SSH 以启用模式登录到设备(这样我就可以像往常一样执行常规管理工作),并在静默模式下运行设备的备份(其中 txt 文件是设备的主机名)。
到目前为止我所做的最好的,但还没有在实时设备上测试过的是:
#!/usr/bin/perl
use warnings;
use strict;
use Expect;
use Data::Dumper;
my $user = $ARGV[0];
my $pw = $ARGV[1];
my $host = $ARGV[2];
my $cmd = 'sh run';
my $exp = new Expect;
$exp->log_file("SSHLOGFILE.txt");#How do i make this to be the hostname of the device though
$exp->log_stdout(0);
$exp->raw_pty(1);
my $cli = "/usr/bin/ssh $user\@$host -o StrictHostKeyChecking=no -q $cmd";
#not sure about this
$exp->spawn($cli) or die "Cannot spawn $cli: $!\n";
$exp->expect(5,
[ qr /ssword:*/ => sub { my $exph = shift;
$exph->send("$pw\n");
exp_continue; }] );
my $read = $exp->exp_before();
chomp $read;
print Dumper($read);
$exp->soft_close();
我可以安装 RANCID,因为我在跳转主机上没有 root 权限,我可以在跳转主机之外运行脚本,并且 Perl 是我唯一的选择,因为我可以在本地库中拥有模块。
答案1
快速编写的脚本和灵活、强大的自动化之间的区别在于多行代码和大量测试。与其重新实现,不如考虑使用或扩展已经实现此功能的现有模块。我搜索了几分钟就找到了几个。
在 Perl 中,思科转储(github)以及由此产生的网络::SSH2::思科。
如果你可以在任何主机上获取 Python,Ansible ios_config 可以通过一个任务备份到文件. 从模板应用一些配置时。
答案2
使用StrictHostKeyChecking=no
是一个非常糟糕的想法。相反,请使用UserKnownHostsFile
包含目标服务器密钥的 hosts 文件选项。只需在启用该选项的情况下手动连接一次即可创建它,因此服务器密钥将永远被锁定。
看起来您正在尝试使用 expect 为 SSH 命令提供密码。这又是一个非常糟糕的主意。改用私钥身份验证,您的密码问题就会消失。或者至少它不再是您的脚本的问题,因为加载私钥可以由 SSH 代理管理。
一旦您使用私钥认证,我想知道您是否根本不需要该脚本,因为裸ssh $user@$host sh run
命令只会执行您想要的操作。