2025-03-05 09:20:04 +01:00

111 lines
2.8 KiB
Perl

#!/usr/bin/perl
use strict;
use warnings;
use Libssh::Session qw(:all);
use POSIX qw(WIFEXITED WEXITSTATUS);
# Install SSH server
if (-f "/etc/debian_version") {
system("apt-get update") == 0
or die "apt-update failed: $?";
system("apt-get install -y openssh-server") == 0
or die "Installation failed: $?";
} elsif (-f "/etc/redhat-release") {
system("dnf install -y openssh-server") == 0
or die "Installation failed: $?";
} else {
die "Unsupported operating system";
}
mkdir("/var/run/sshd") unless -d "/var/run/sshd";
system("ssh-keygen -A") == 0
or die "SSH keys generation failed: $?";
if (getpwnam("testuser")) {
print "User testuser already exists\n";
} else {
system("useradd -m testuser") == 0
or die "User creation failed: $?";
}
system("echo 'testuser:testpassword' | chpasswd") == 0
or die "Password configuration failed: $?";
# SSH configuration
open(my $fh, '>', '/etc/ssh/sshd_config')
or die "Cannot open sshd_config: $!";
print $fh "Port 2222\n";
print $fh "PermitRootLogin no\n";
print $fh "AllowUsers testuser\n";
print $fh "PasswordAuthentication yes\n";
close($fh);
# Start SSH server
my $pid = fork();
die "Fork failed: $!" unless defined $pid;
if ($pid == 0) {
exec("/usr/sbin/sshd", "-D")
or die "Cannot start SSH server: $!";
}
# Wait and check the port
sleep(5);
# Check the port with Perl
use IO::Socket::INET;
my $sock = IO::Socket::INET->new(
PeerAddr => '127.0.0.1',
PeerPort => 2222,
Proto => 'tcp'
);
die "Port SSH 2222 is not listening" unless $sock;
$sock->close();
# Connection test with Libssh::Session
eval {
my $session = Libssh::Session->new();
$session->options(
host => "127.0.0.1",
port => 2222,
user => "testuser",
LogVerbosity => 1,
PrintError => 1,
Timeout => 10
);
print "Trying to connect...\n";
$session->connect() == SSH_OK or die "Connection failed: " . $session->get_error();
print "Trying to authenticate...\n";
$session->auth_password(password => "testpassword") == SSH_AUTH_SUCCESS or die "Authentification failed: " . $session->get_error();
print "SSH connection test succeeded\n";
$session->disconnect();
};
if ($@) {
kill 'TERM', $pid;
die "Test failed: $@";
}
# Cleaning
kill 'TERM', $pid;
waitpid($pid, 0);
# Uninstall SSH server
if (-f "/etc/debian_version") {
system("apt-get autoremove -y --purge openssh-server") == 0
or die "Uninstallation failed: $?";
} elsif (-f "/etc/redhat-release") {
system("dnf autoremove --setopt=keepcache=True -y openssh-server") == 0
or die "Uninstallation failed: $?";
} else {
die "Unsupported operating system";
}
system("userdel -r testuser") == 0
or die "Cannot delete user: $?";
print "Test and cleanup succeeded\n";