home_server:home_server_setup:other_services:ssh

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revisionBoth sides next revision
home_server:home_server_setup:other_services:ssh [2022-06-26 Sun wk25 09:13] baumkphome_server:home_server_setup:other_services:ssh [2023-12-10 Sun wk49 13:16] baumkp
Line 1: Line 1:
 +{{tag>linux debian ubuntu ssh "ssh notes"}}
 ======SSH Notes====== ======SSH Notes======
 +
 +=====SSH Login Message=====
 +====Acronyms and Definitions====
 +  *MOTD = Message of the Day
 +
 +====Login Messages====
 +  *''sudo vim /etc/issue.net'' Displays a message before the user begins login, I do not use this.
 +    *''sudo vim /etc/ssh/sshd_config'' ensure the following option is set ''Banner /etc/issue.net'' (you can actually used any path/file)
 +    *''sudo systemctl reload sshd'' needs to be performed after any change to the configuration file to activate the changes.
 +  *''sudo vim /etc/motd'' Displays the banner text after login. This usually has some predefined Linux distribution text
 +
 +====Login Scripts====
 +====Debian====
 +  *''ls -la /etc/update-motd.d/'' to see the scripts that are run after the MOTD is displayed.
 +The Debian script is very simple: 
 +<code bash>
 +#!/bin/sh
 +uname -snrvm
 +</code>
 +
 +====Ubuntu====
 +Ubuntu has multiple scripts some that I like and some that I do not like.  
 +This system status information script, ++++/etc/update-motd.d/50-landscape-sysinfo|
 +<code>
 +#!/bin/sh
 +# pam_motd does not carry the environment
 +[ -f /etc/default/locale ] && . /etc/default/locale
 +export LANG
 +cores=$(grep -c ^processor /proc/cpuinfo 2>/dev/null)
 +[ "$cores" -eq "0" ] && cores=1
 +threshold="${cores:-1}.0"
 +if [ $(echo "`cut -f1 -d ' ' /proc/loadavg` < $threshold" | bc) -eq 1 ]; then
 +    echo
 +    echo -n "  System information as of "
 +    /bin/date
 +    echo
 +    /usr/bin/landscape-sysinfo
 +else
 +    echo
 +    echo " System information disabled due to load higher than $threshold"
 +fi</code>
 +++++
 +The main information script is written in python3, ++++/usr/bin/landscape-systeminfo|
 +<code>
 +#!/usr/bin/python3
 +import sys, os
 +
 +try:
 +    if os.path.dirname(os.path.abspath(sys.argv[0])) == os.path.abspath("scripts"):
 +        sys.path.insert(0, "./")
 +    else:
 +        from landscape.lib.warning import hide_warnings
 +        hide_warnings()
 +
 +    from twisted.internet import reactor
 +
 +    from landscape.sysinfo.deployment import run
 +except ImportError:
 +    # For some reasons the libraries are not importable for now. We are
 +    # probably during an upgrade procedure, so let's exit, expecting the
 +    # dependencies to be fixed at next run.
 +    sys.exit(2)
 +
 +
 +if __name__ == "__main__":
 +    run(sys.argv[1:], reactor)
 +
 +</code>
 +  *If twisted not installed, ''pip install twisted'' to install
 +  *if cpuinfo not installed, ''pip install py-cpuinfo'' to install
 +++++
 +
 +====Python Code====
 +++++python3 agnostic code | 
 +<code>
 +#!/usr/bin/python3
 +
 +import psutil
 +import platform
 +from datetime import datetime
 +import cpuinfo
 +import socket
 +import uuid
 +import re
 +
 +def get_size(bytes, suffix="B"):
 +    """
 +    Scale bytes to its proper format
 +    e.g:
 +        1253656 => '1.20MB'
 +        1253656678 => '1.17GB'
 +    """
 +    factor = 1024
 +    for unit in ["", "K", "M", "G", "T", "P"]:
 +        if bytes < factor:
 +            return f"{bytes:.2f}{unit}{suffix}"
 +        bytes /= factor
 +
 +def System_information():
 +    print("="*40, "System Information", "="*40)
 +    uname = platform.uname()
 +    print(f"System: {uname.system}")
 +    print(f"Node Name: {uname.node}")
 +    print(f"Release: {uname.release}")
 +    print(f"Version: {uname.version}")
 +    print(f"Machine: {uname.machine}")
 +    print(f"Processor: {uname.processor}")
 +    print(f"Processor: {cpuinfo.get_cpu_info()['brand_raw']}")
 +    print(f"Ip-Address: {socket.gethostbyname(socket.gethostname())}")
 +    print(f"Mac-Address: {':'.join(re.findall('..', '%012x' % uuid.getnode()))}")
 +
 +    # Boot Time
 +    print("="*40, "Boot Time", "="*40)
 +    boot_time_timestamp = psutil.boot_time()
 +    bt = datetime.fromtimestamp(boot_time_timestamp)
 +    print(f"Boot Time: {bt.year}/{bt.month}/{bt.day} {bt.hour}:{bt.minute}:{bt.second}")
 +
 +    # print CPU information
 +    print("="*40, "CPU Info", "="*40)
 +    # number of cores
 +    print("Physical cores:", psutil.cpu_count(logical=False))
 +    print("Total cores:", psutil.cpu_count(logical=True))
 +    # CPU frequencies
 +    cpufreq = psutil.cpu_freq()
 +    print(f"Max Frequency: {cpufreq.max:.2f}Mhz")
 +    print(f"Min Frequency: {cpufreq.min:.2f}Mhz")
 +    print(f"Current Frequency: {cpufreq.current:.2f}Mhz")
 +    # CPU usage
 +    print("CPU Usage Per Core:")
 +    for i, percentage in enumerate(psutil.cpu_percent(percpu=True, interval=1)):
 +        print(f"Core {i}: {percentage}%")
 +    print(f"Total CPU Usage: {psutil.cpu_percent()}%")
 +
 +    # Memory Information
 +    print("="*40, "Memory Information", "="*40)
 +    # get the memory details
 +    svmem = psutil.virtual_memory()
 +    print(f"Total: {get_size(svmem.total)}")
 +    print(f"Available: {get_size(svmem.available)}")
 +    print(f"Used: {get_size(svmem.used)}")
 +    print(f"Percentage: {svmem.percent}%")
 +
 +    print("="*20, "SWAP", "="*20)
 +    # get the swap memory details (if exists)
 +    swap = psutil.swap_memory()
 +    print(f"Total: {get_size(swap.total)}")
 +    print(f"Free: {get_size(swap.free)}")
 +    print(f"Used: {get_size(swap.used)}")
 +    print(f"Percentage: {swap.percent}%")
 +
 +    # Disk Information
 +    print("="*40, "Disk Information", "="*40)
 +    print("Partitions and Usage:")
 +    # get all disk partitions
 +    partitions = psutil.disk_partitions()
 +    for partition in partitions:
 +        print(f"=== Device: {partition.device} ===")
 +        print(f"  Mountpoint: {partition.mountpoint}")
 +        print(f"  File system type: {partition.fstype}")
 +        try:
 +            partition_usage = psutil.disk_usage(partition.mountpoint)
 +        except PermissionError:
 +            # this can be catched due to the disk that
 +            # isn't ready
 +            continue
 +        print(f"  Total Size: {get_size(partition_usage.total)}")
 +        print(f"  Used: {get_size(partition_usage.used)}")
 +        print(f"  Free: {get_size(partition_usage.free)}")
 +        print(f"  Percentage: {partition_usage.percent}%")
 +    # get IO statistics since boot
 +    disk_io = psutil.disk_io_counters()
 +    print(f"Total read: {get_size(disk_io.read_bytes)}")
 +    print(f"Total write: {get_size(disk_io.write_bytes)}")
 +
 +    ## Network information
 +    print("="*40, "Network Information", "="*40)
 +    ## get all network interfaces (virtual and physical)
 +    if_addrs = psutil.net_if_addrs()
 +    for interface_name, interface_addresses in if_addrs.items():
 +        for address in interface_addresses:
 +            print(f"=== Interface: {interface_name} ===")
 +            if str(address.family) == 'AddressFamily.AF_INET':
 +                print(f"  IP Address: {address.address}")
 +                print(f"  Netmask: {address.netmask}")
 +                print(f"  Broadcast IP: {address.broadcast}")
 +            elif str(address.family) == 'AddressFamily.AF_PACKET':
 +                print(f"  MAC Address: {address.address}")
 +                print(f"  Netmask: {address.netmask}")
 +                print(f"  Broadcast MAC: {address.broadcast}")
 +    ##get IO statistics since boot
 +    net_io = psutil.net_io_counters()
 +    print(f"Total Bytes Sent: {get_size(net_io.bytes_sent)}")
 +    print(f"Total Bytes Received: {get_size(net_io.bytes_recv)}")
 +
 +if __name__ == "__main__":
 +
 +    System_information()
 +</code>
 +++++
 +
 +====Some Links:====
 +  *[[How to manage SSH login message|https://www.simplified.guide/ssh/suppress-banner]]
 +  *[[HowTo: Set a Warning Message (Banner) in SSH|https://www.shellhacks.com/setup-warning-message-banner-ssh/]]
 +  *[[Protect SSH Logins with SSH & MOTD Banner Messages|https://www.tecmint.com/protect-ssh-logins-with-ssh-motd-banner-messages/]]
  
 <- home_server:home_server_setup:other_services:webmin|Prev ^ home_server:home_server_setup:other_services:index|Start page ^ home_server:home_server_setup:other_services:bash|Next -> <- home_server:home_server_setup:other_services:webmin|Prev ^ home_server:home_server_setup:other_services:index|Start page ^ home_server:home_server_setup:other_services:bash|Next ->
  • /app/www/public/data/pages/home_server/home_server_setup/other_services/ssh.txt
  • Last modified: 2023-12-26 Tue wk52 11:38
  • by baumkp