Nützliche selbstgestrickte Scripte für die Alltagsadministration

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 30.10.2023 23:05:35

Merci!

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von HelsAett » 27.11.2023 11:42:22

Ich habe eines zum Aufbau von SSH Tunneln, welches ich regelmässig nutze. Achtung "KnownHost" muss dazu unverschlüsselt seien.

Code: Alles auswählen

#!/bin/bash

# Function to display a list of known hosts
show_known_hosts() {
  cut -f 1 -d ' ' <~/.ssh/known_hosts | sed -e 's/,.*//g' | uniq | grep -v "\[" | tr ' ' '\n' | grep -v "=" | sort
}

# Function to prompt for yes/no answers
ask_yes_no() {
  local prompt="$1 (yes/no): "
  read -p "$prompt" response
  case "$response" in
    [YyJj]) return 0 ;; # Yes
    [Nn]) return 1 ;;   # No
    *) ask_yes_no "$prompt" ;; # Repeat prompt if the answer is not valid
  esac
}

# Display the list of known hosts if the user chooses to
if ask_yes_no "Do you want to display the list of known hosts?"; then
  show_known_hosts
fi

# Read connection details
read -p "Server hostname or IP address: " Server
read -p "Username: " User
read -p "Remote server source port: " sPort
read -p "Local port on your computer: " lPort

# Set up SSH tunnel and display message
if ssh -L ${lPort}:${Server}:${sPort} -D 1083 -p 1081 ${User}@localhost \
  "while true; do echo -e \"Tunnel to ${Server}, local port ${lPort}\"; sleep 15; done"
then
  echo "The SSH tunnel has been successfully established."
else
  echo "ERROR: The SSH tunnel could not be established."
fi


ein weiteres zum auslesen, der Gültigkeit von Zertifikaten die übers System verteilt sind.

Code: Alles auswählen

#!/bin/bash

# Check if the required arguments are provided
if [ "$#" -ne 1 ]; then
    script_name=$(basename "$0")
    echo "Invalid number of arguments. Please use the command as follows:"
    echo "Usage: $script_name <DIRECTORY>"
    exit 1
fi

# Directory to search for certificates
search_directory="$1"

# Function to extract certificate information and check validity
extract_certificate_info() {
    cert_file="$1"
    
    # Extract certificate issuer
    issuer=$(openssl x509 -noout -issuer -in "$cert_file" | cut -d '=' -f 2-)
    
    # Extract certificate subject (domain)
    subject=$(openssl x509 -noout -subject -in "$cert_file" | cut -d '=' -f 2-)
    
    # Extract certificate serial number
    serial=$(openssl x509 -noout -serial -in "$cert_file" | cut -d '=' -f 2)
    
    # Extract certificate validity
    validity=$(openssl x509 -noout -dates -in "$cert_file" | grep "notBefore\|notAfter")

    not_after_date=$(echo "$validity" | grep "notAfter" | cut -d '=' -f 2)
    
    unixtime=$(date +%s)
    
    # Calculate the number of days until the expiration date
    expired=$(date -d "${not_after_date}" +%s)
    difference=$((expired - unixtime))
    days=$((difference / 86400))

    if [ "$days" -lt 0 ]; then
        # The expiration date is in the past (Error)
        color_start="\e[0;31m"  # Red
        color_end="\e[m"
        color_status="Error"
    elif [ "$days" -le 300 ]; then
        # The expiration date is in less than or equal to 30 days (Warning)
        color_start="\e[0;33m"  # Yellow
        color_end="\e[m"
        color_status="Warning"
    else
        # The expiration date is in more than 30 days (Success)
        color_start="\e[0;32m"  # Green
        color_end="\e[m"
        color_status="Ok"
    fi

    echo "Certificate: $cert_file"
    echo "Issuer: $issuer"
    echo "Subject: $subject"
    echo "Serial Number: $serial"
    echo -e "Validity: ${color_start}$not_after_date${color_end} ($color_status, the expiration date is in more than 30 days)"
    echo
}

# Find and process certificates in the directory
find "$search_directory" -type f -iname "*.crt" | while read cert_file; do
    extract_certificate_info "$cert_file"
done

Ein weiteres für das automatische verschlüsselte Backups, beim Anschluss bestimmter USB Platten. Voraussetzung hier, Luks verschlüsselte USB Platten, die UDEV bekannt, sind so dass das Script beim Anschluss dieser automatisch Startet. Das Script Mountet dann die USB Platten, Entschlüsselt diese und Startet dann ein Backupscript. Das Backupscript wiederrum kann dann ein einzelnes Backup Starten oder wenn mehrere USB Platten angeschlossen wurden, die bekannt sind, diese dann automatisch synchronisieren.

Code: Alles auswählen

#!/bin/bash

# Export paths
export PATH=$PATH:/usr/bin:/usr/sbin:/bin:/sbin
# Set the DISPLAY variable for graphical applications
export DISPLAY=:0
# Set the keyfile path
keyfile=/mnt/usbstick/KeyFile.bin

# Check if USB auto-backup is already running
backup_is_running=/tmp/start_usb_auto_backup_is_running
if [ -f "$backup_is_running" ]; then
  # If the script is already running, exit
  exit 0
fi
su debian -c "touch $backup_is_running"

# Wait for 3 seconds for other devices
sleep 3

# Function to decrypt and mount a USB drive
decrypt_and_mount() {
  local device=$1
  local mapper_name="crypt_usb_$device"
  local mount_point="/mnt/crypt_usb_$device"

  # Check if the device is already decrypted and mounted
  if [ -e "/dev/mapper/$mapper_name" ] && [ -e "$mount_point/Linux" ]; then
    echo "Drive $device is already decrypted and mounted."
    return
  fi

  # Decrypt and mount the USB drive
  /usr/sbin/cryptsetup luksOpen "/dev/$device" "$mapper_name" --key-file "$keyfile" && \
  /bin/systemd-mount "/dev/mapper/$mapper_name" "$mount_point/"
}

# Check the number of USB devices
usb_devices_count=$(lsusb | grep -c "152d")

# Decide if USB devices were found
if [ "$usb_devices_count" -gt 0 ]; then
  # Find USB devices and call decrypt_and_mount for each
  usb_devices=($(ls -l /dev/disk/by-id/usb* | awk '{print $NF}' | cut -c7-))
  for device in "${usb_devices[@]}"; do
    decrypt_and_mount "$device"
  done
fi

# Call the user's backup script
su debian -c "/opt/autobackup/usb_auto_backup.sh &"

# Wait for the backup script
sleep 10

# Check if the backup script is still running; if not, unmount encrypted devices and exit the script
while true; do
  if [ -f "$backup_is_running" ]; then
    # If the backup is running, wait for 10 seconds and check again
    sleep 10
  else
    # If the backup is not running, unmount the encrypted devices and exit the script
    /opt/autobackup/umount_usb_auto_backup.sh
    exit 0
  fi
done

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Script: Load- und temperaturabhängige CPU-Frequenzsteuerung

Beitrag von heisenberg » 13.03.2024 13:42:55

Load- und temperaturabhängige CPU-Frequenzsteuerung

Ich habe mir hier mal ein Script geschrieben, das die CPU-Frequenz herunterregelt, wenn die Temperatur zu hoch ist. Solche Programme gibt es Einige. Ich habe mir das geschrieben, weil ich die Drosselung gerne nur dann hätte, wenn die CPU-Load ausreichend niedrig ist. D. h. die Überschreitung der Maximaltemperatur ist bei hoher Load für mich akzeptabel. Ich nehme dabei auch immer den höchsten Load-Wert aus dem Tripel 1/5/15-Minuten Load, damit sowohl auf kurzfristige Laststeigerungen schnell reagiert wird, als auch bei nur kurzfristigen Lastabfällen nicht sofort die Frequenz wieder herunter gedreht wird. Ich möchte also eine möglichst geringe Beeinträchtigung der Performance des Servers.

Ansonsten wird bei großen Unter- oder Überschreitungen der Temperatur mit größeren Frequenzsprüngen reagiert, um eine schnellere Wirkung zu erzielen. Mir ist im Übrigen auch klar, dass die CPU-Auslastung nicht der einzige Auslöser für eine hohe Load ist. Auch die Entscheidung einfach von allen Temperatursensoren immer den höchsten Temperaturwert zu nehmen, trifft üblicherweise auf den Prozessor-Sensor zu, muss es aber nicht unbedingt. Das ist nicht perfekt, passt aber für den vorliegenden Anwendungsfall.

Ein Gedanke, den ich am Anfang hatte, war noch der, ob das so gut ist, ständig an den Frequenzlimits rum zu drehen. Nachdem sich die aktuellen Taktfrequenzen der CPU-Cores aber sowieso ständig ändern (governor powersave), scheint mir dieses Bedenken unbegründet.

Auch scheint das Anliegen insgesamt widersprüchlich: Die Temperatur geht hoch, wenn die CPU-Last hoch geht und wenn die CPU Last hat, dann wird sie auch gebraucht. Da ergibt es ja keinen Sinn, gleichzeitig die Geschwindigkeit runter zu drehen. Faktisch bringt es aber doch etwas.

Code: Alles auswählen

#!/usr/bin/env ruby

#       CPU Temperature/Load-dependent CPU-Frequency control
#
#       Throttle CPU when temperature is too high, but only when cpu load is low.
#
#       INSTALLATION
#
#         install the following ruby gems
# 
#           gem install sys-cpu
#           gem install awesome_print
#           gem install find
#
#         needs the following debian-packages
#
#           cpufrequtils
#
#       RULES (prio from high to low)
# 
#       if load_avg    >=MAX_LOAD   frequency to maximum
#       if load_avg    >=HOLD_LOAD  no frequency reduction
#       if temperature >= CRIT+10   frequenz minus 1500 (delta-2)
#       if temperature >= CRIT+5    frequenz minus  500 (delta-1)
#       if temperature >= CRIT      frequenz minus  100 (delta-0)
#       if temperature <  CRIT-15   frequenz plus  1500 (delta-2)
#       if temperature <  CRIT-10   frequenz plus   500 (delta-1)
#       if temperature <  CRIT-5    frequenz plus   100 (delta-0)
#

require 'sys-cpu'
require 'awesome_print' # optional - maybe commented out
require 'find'

# global variables

$cpu_step_unit=1000                     # units for changing the cpu frequency
$hysteresis_delay=5                     # delay in seconds to wait for temperature change to happen
$max_load_allowed=10                    # cpu load at which frequency will be set to max
$load_hold=8                            # cpu load at which frequency will no longer be reduced
$temp_limit_upper=75                    # temperature at which cpu will be throttled
$temp_limit_lower=$temp_limit_upper-5   # temperature at which cpu will be raised
$temp_limit_delta1=5                    # temperature difference at which frequency change delta1 will be used
$temp_limit_delta2=10                   # temperature difference at which frequency change delta2 will be used
$freq_change_delta0=100                 
$freq_change_delta1=500               
$freq_change_delta2=1500

$temp_sensor_files=[]                   # temperature sensor files for this system (autodetect)
$core_count                             # number of available cpu cores (autodetect)
$cpu_freq_max                           # highest possible cpu frequency (autodetect)
$cpu_freq_min                           # lowest possible cpu frequency (autodetect)


$log_levels = { 
  7 => "DBG2",
  6 => "DBG1",
  5 => "INFO",
  4 => "NOTE",
  3 => "WARN",
  2 => "ERRO", 
  1 => "CRIT", 
  0 => "NONE" }

$lrev = {
  :DBG2 => 7,
  :DBG1 => 6,
  :INFO => 5,
  :NOTE => 4,
  :WARN => 3,
  :ERRO => 2, 
  :CRIT => 1, 
  :NONE => 0 }

$log_level = $lrev[:INFO]

def log(level,text)
 if level <= $log_level then
   puts $log_levels[level] + " " + text
 end
end

def lg_dbg2(text)  log($lrev[:DBG2],text) end
def lg_dbg(text)   log($lrev[:DBG1],text) end
def lg_info(text)  log($lrev[:INFO],text) end
def lg_note(text)  log($lrev[:NOTE],text) end
def lg_warn(text)  log($lrev[:WARN],text) end
def lg_error(text) log($lrev[:ERRO],text) end
def lg_crit(text)  log($lrev[:CRIT],text) end

def get_temp_sensors() 

  # find temperature sensor files of this system

  Find.find("/sys") do |path|
    if File.basename(path) == "temp" then
      $temp_sensor_files.push(path)
    end
  end

end

def get_temperature() 

  # get maximum temperature of all found sensors

  max_temp=0
  $temp_sensor_files.each do |file|
    temp = File.open(file).read.to_i/1000
    if temp > max_temp then
      max_temp = temp
    end
  end
  return max_temp

end

def get_system_data() 

  $cpu_freq_max=File.open("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq").read.to_i/1000
  $cpu_freq_min=File.open("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq").read.to_i/1000
  $core_count=`nproc`.to_i
  lg_info("")
  lg_info("CPU Max Frequency          : #{$cpu_freq_max} MHz")
  lg_info("CPU Min Frequency          : #{$cpu_freq_min} MHz")
  lg_info("CPU Core Count             : #{$core_count}")
  lg_info("High Temperature Threshold : #{$temp_limit_upper} °C")
  lg_info("Low Temperature Threshold  : #{$temp_limit_lower} °C")
  get_temp_sensors
  lg_info("Temperature Sensors found  : #{$temp_sensor_files.count}")
  lg_info("Max load Threshold         : #{$max_load_allowed}")
  lg_info("Hold load Threshold        : #{$load_hold}")
  lg_info("Frequency Set Delay        : #{$hysteresis_delay}")
  lg_info("")

end

def get_load() 
  # get highest value of cpu load (1/5/15 min average)
  return Sys::CPU.load_avg.max
end

def check_high_temp(current_temperature)
  freq_change=false
  if current_temperature > ($temp_limit_upper + $temp_limit_delta2) then
    freq_change = 0 - $freq_change_delta2
  else
    if current_temperature > ($temp_limit_upper + $temp_limit_delta1) then
      freq_change = 0 - $freq_change_delta1
    else
      if current_temperature > $temp_limit_upper then
        freq_change = 0 - $freq_change_delta0
      end
    end
  end
  lg_dbg("evaluated freq_change: #{freq_change}")
  return freq_change
end

def check_low_temp(current_temperature)
  freq_change=false
  if current_temperature < $temp_limit_lower then
    freq_change = $freq_change_delta0
    if current_temperature < ($temp_limit_lower - $temp_limit_delta1) then
      freq_change = $freq_change_delta1
      if current_temperature < ($temp_limit_lower - $temp_limit_delta2) then
        freq_change = $freq_change_delta2
      end
    end
  end
  lg_dbg("evaluated freq_change: #{freq_change}")
  return freq_change
end

def freq_change(freq_diff)
  current_freq=cpu_freq_get
  cpu_freq_set_all_cores current_freq + freq_diff
end

def cpu_freq_set_all_cores(freq)

  lg_dbg("Evaluating to set frequency #{freq.to_s} MHz on all cores")

  if freq < $cpu_freq_min then
    lg_dbg("Trying to set frequency #{freq.to_s} MHz which is below minimum. setting to minimum")
    freq = $cpu_freq_min
  end

  if freq > $cpu_freq_max then
    lg_dbg("Trying to set frequency #{freq.to_s} MHz which is above maximum. setting to maximum")
    freq = $cpu_freq_max
  end

  current_freq=cpu_freq_get
  if current_freq == freq then
    lg_dbg("Trying to set frequency #{freq.to_s} MHz which is already set, doing nothing")
    return
  end

  lg_dbg2("Setting frequency #{freq.to_s} MHz on all cores")
  for core_nr in 0 .. ($core_count - 1) do 
    res = system("cpufreq-set","-c", core_nr.to_s, "--max", (freq * 1000).to_s );
  end
end

def cpu_freq_get()
  return File.open("/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq").read.to_i/1000
end

def eval_freq_change(current_load, current_temperature)

    if current_load > $max_load_allowed then
      lg_info("High load detected.")
      cpu_freq_set_all_cores $cpu_freq_max
    else
      if current_load > $load_hold then
        lg_info("Above normal load detected.")
        # high load: don't reduce speed
        if freq_change_amount=check_low_temp(current_temperature) then
          lg_dbg("Temperature is cool, trying to increase by #{freq_change_amount} MHz")
          freq_change freq_change_amount
        end
      else
        # normal load: check temperature
        lg_dbg("Load is normal. Checking Temperature")

        # check for too high tempratures
        if freq_change_amount=check_high_temp(current_temperature) then
          # decrease frequency
          lg_dbg("Temperature is high, trying to decrease by #{freq_change_amount*-1} MHz")
          freq_change freq_change_amount
        else
          # check for cool enough temperatures
          if freq_change_amount=check_low_temp(current_temperature) then
            lg_dbg("Temperature is cool, trying to increase by #{freq_change_amount} MHz")
            # increase frequency
            freq_change freq_change_amount
          else
            lg_dbg("Temperature is at an acceptable level")
          end
        end

      end
    end
end

def main()
    $stdout.sync = true
    get_system_data()
    while(1) do
      current_temperature=get_temperature
      current_load=get_load
      lg_info("Temperature: #{current_temperature} °C Load: #{"%.2f" % current_load} CPU-Frequency: #{cpu_freq_get()} MHz")
      eval_freq_change(current_load,current_temperature)
      sleep $hysteresis_delay
    end
end

main
Beispiel der Logausgabe

Code: Alles auswählen

Mar 13 13:57:55 icarus02 systemd[1]: Started CPU Freqency Control to keep maximum temperature.
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO CPU Max Frequency          : 5000 MHz
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO CPU Min Frequency          : 800 MHz
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO CPU Core Count             : 16
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO High Temperature Threshold : 65 °C
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO Low Temperature Threshold  : 60 °C
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature Sensors found  : 4
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Max load Threshold         : 10
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Hold load Threshold        : 8
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Frequency Set Delay        : 5
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 82 °C Load: 69.45 CPU-Frequency: 5000 MHz
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO High load detected.
Mar 13 13:58:01 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 83 °C Load: 68.96 CPU-Frequency: 5000 MHz
Mar 13 13:58:01 icarus02 cpu-freq-throttle.rb[4044249]: INFO High load detected.
Mar 13 13:58:06 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 82 °C Load: 68.44 CPU-Frequency: 5000 MHz
Mar 13 13:58:06 icarus02 cpu-freq-throttle.rb[4044249]: INFO High load detected.
Mar 13 13:58:11 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 83 °C Load: 67.95 CPU-Frequency: 5000 MHz
Mar 13 13:58:11 icarus02 cpu-freq-throttle.rb[4044249]: INFO High load detected.
...
Mar 13 14:37:19 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 49 °C Load: 8.16 CPU-Frequency: 5000 MHz
Mar 13 14:37:19 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:24 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 50 °C Load: 8.12 CPU-Frequency: 5000 MHz
Mar 13 14:37:24 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:29 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 50 °C Load: 8.08 CPU-Frequency: 5000 MHz
Mar 13 14:37:29 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:34 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 49 °C Load: 8.05 CPU-Frequency: 5000 MHz
Mar 13 14:37:34 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:39 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 68 °C Load: 8.01 CPU-Frequency: 5000 MHz
Mar 13 14:37:39 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:44 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 71 °C Load: 7.97 CPU-Frequency: 5000 MHz
Mar 13 14:37:49 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 64 °C Load: 7.95 CPU-Frequency: 4500 MHz
Mar 13 14:37:54 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 49 °C Load: 7.91 CPU-Frequency: 4500 MHz
Mar 13 14:37:59 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 73 °C Load: 7.90 CPU-Frequency: 5000 MHz
Mar 13 14:38:04 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 68 °C Load: 7.88 CPU-Frequency: 4500 MHz
Mar 13 14:38:09 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 62 °C Load: 7.86 CPU-Frequency: 4400 MHz
Mar 13 14:38:14 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 64 °C Load: 7.83 CPU-Frequency: 4400 MHz
Mar 13 14:38:19 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 64 °C Load: 7.79 CPU-Frequency: 4400 MHz
Mar 13 14:38:24 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 65 °C Load: 7.75 CPU-Frequency: 4400 MHz
Mar 13 14:38:29 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 51 °C Load: 7.72 CPU-Frequency: 4400 MHz
Mar 13 14:38:34 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 64 °C Load: 7.69 CPU-Frequency: 4900 MHz
Mar 13 14:38:39 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 50 °C Load: 7.65 CPU-Frequency: 4900 MHz
Mar 13 14:38:44 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 58 °C Load: 7.61 CPU-Frequency: 5000 MHz
So wirkt sich dass dann im Betrieb aus:

4733

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 03.04.2024 11:48:53

Ich bekomme da eine Fehlermeldung bei dem CPU Script

Code: Alles auswählen

./test
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- sys-cpu (LoadError)
	from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
	from ./test:31:in `<main>'
Bash Scripte die ich fast täglich nutze :

https://github.com/speefak/ipspec
https://github.com/speefak/df_mod
https://github.com/speefak/rear-backup
https://github.com/speefak/backup_system_user_config

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 03.04.2024 11:51:27

speefak hat geschrieben: ↑ zum Beitrag ↑
03.04.2024 11:48:53
Ich bekomme da eine Fehlermeldung bei dem CPU Script

Code: Alles auswählen

./test
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- sys-cpu (LoadError)
	from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
	from ./test:31:in `<main>'
Im Head des Scriptes stehen ein paar Installationsanweisungen. Es müssen Ruby-Module installiert werden:

Code: Alles auswählen

# gem install sys-cpu awesome_print find
Debiancpufrequtils müssen auch installiert sein.

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 03.04.2024 11:54:56

whisper hat geschrieben: ↑ zum Beitrag ↑
25.03.2021 20:13:35
1+ für den Thread!

Ich hatte mal vor Jahren einen Rechte Gau. Das damals verwendete Backup hatte beim Restore die Rechte der Dateien versaut.
Ich war selber schuld, weil ich halt direkt zurück gesichert hatte.
Deshalb läuft auf dem Server nun das hier:

Code: Alles auswählen

#!/bin/bash
#dateirechte.sh
DATUM=$(date +%d-%m-%Y)

nice getfacl -R -n / >/home/backup/dateirechte-$DATUM.txt
 
# wieder herstellen mit
#setfacl --restore=dateirechte.txt
Die Datei dateirechte.txt wird täglich mitgesichert und hilft versehentliche Änderungen zu reparieren
Ausserdem bei evtl. forensichen Vorfällen

Das ist gar nicht so verkehrt - mir ist auch schon mal aus versehen ein chown -R root:root / durchgelaufen - war nicht so der dolle :oops: :cry: :evil: . Zum Glück hatte ich noch ein REAR image. Schön wäre die Möglichkeit Pfade auszulassen. Mein 20 TB Archiv hat nur eine Rechte/Zugriffs Konfiguration.

Benutzeravatar
whisper
Beiträge: 3373
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 03.04.2024 16:30:05

speefak hat geschrieben: ↑ zum Beitrag ↑
03.04.2024 11:54:56
Das ist gar nicht so verkehrt - mir ist auch schon mal aus versehen ein chown -R root:root / durchgelaufen - war nicht so der dolle :oops: :cry: :evil: . Zum Glück hatte ich noch ein REAR image. Schön wäre die Möglichkeit Pfade auszulassen. Mein 20 TB Archiv hat nur eine Rechte/Zugriffs Konfiguration.
Danke, läuft immer noch und hat mit der Zeit schon ein paar mal geholfen.
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 05.04.2024 10:42:48

heisenberg hat geschrieben: ↑ zum Beitrag ↑
03.04.2024 11:51:27
speefak hat geschrieben: ↑ zum Beitrag ↑
03.04.2024 11:48:53
Ich bekomme da eine Fehlermeldung bei dem CPU Script

Code: Alles auswählen

./test
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- sys-cpu (LoadError)
	from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
	from ./test:31:in `<main>'
Im Head des Scriptes stehen ein paar Installationsanweisungen. Es müssen Ruby-Module installiert werden:

Code: Alles auswählen

# gem install sys-cpu awesome_print find
Debiancpufrequtils müssen auch installiert sein.
Pakete sind installiert, Ruby Pakete zu cpufrequtils :roll:

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 05.04.2024 11:40:51

speefak hat geschrieben: ↑ zum Beitrag ↑
05.04.2024 10:42:48
Pakete sind installiert, Ruby Pakete zu cpufrequtils :roll:
Ich wiederhole das nochmal: Die folgende Zeile, die im Skript steht und die ich in meinem letzten Beitrag schrieb, muss als root ausgeführt werden:

Code: Alles auswählen

gem install sys-cpu awesome_print find
Das sind drei Module, die ich im Skript einbinde. Die müssen da sein.

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 11.04.2024 16:29:46

Dokus in Scripten lese ich als erstes 8) hab's als root und User probiert. Werd's die Tage nochmal inner frischen D12 VM probieren.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 11.04.2024 16:39:23

Was ist bei Dir die Ausgabe von:

Code: Alles auswählen

gem install sys-cpu awesome_print find
Die Fehlermeldung von Dir bedeutet, dass das Modul nicht geladen werden könnte, weil nicht gefunden.

Benutzeravatar
speefak
Beiträge: 532
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 13.04.2024 20:57:33

Code: Alles auswählen

sudo gem install sys-cpu awesome_print find
[sudo] Passwort für speefak: 
Building native extensions. This could take a while...
ERROR:  Error installing sys-cpu:
	ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/3.1.0/gems/ffi-1.16.3/ext/ffi_c
/usr/bin/ruby3.1 -I /usr/lib/ruby/vendor_ruby -r ./siteconf20240413-2613428-vfkp0d.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/3.1.0/gems/ffi-1.16.3 for inspection.
Results logged to /var/lib/gems/3.1.0/extensions/x86_64-linux/3.1.0/ffi-1.16.3/gem_make.out
Successfully installed awesome_print-1.9.2
Parsing documentation for awesome_print-1.9.2
Done installing documentation for awesome_print after 0 seconds
Successfully installed find-0.2.0
Parsing documentation for find-0.2.0
Done installing documentation for find after 0 seconds
2 gems installed
ruby devel fehlte

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 27.05.2024 19:19:59

Das Temperaturskript habe ich jetzt dauerhaft auf einem Kundenserver aktiv. Die Minimalfrequenz habe ich mal auf 2 GHz (max. 5 GHz) eingestellt. 800 MHz (HW-Minimum) habe ich micht nicht getraut. Funktioniert super. Im letzten Monat ist der nur einmal auf die Maximalfrequenz gegangen. Ansonsten ist das System unter sehr wenig Last und seit anschalten des Scriptes um ca. 40 °C kühler in der Durchschnittstemperatur. Hetzner freut sich bestimmt. ;-) Der Programmierer hat seine DB-Zugriffe auch nochmal ordentlich optimiert.

Benutzeravatar
whisper
Beiträge: 3373
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 08.06.2024 11:02:28

Ich habe mit dem module Debianratelimit für Apache experimentiert.
Damit kann man die Ausliefergeschwindigkeit von Webseiten und auch kompletter Domains kontrollieren, also verlangsamen.
-doch wie testet man das komfortabel?
Da Debianwget im Prinzip die Downloadgeschwindigkeit anzeigt, habe ich damit ein einfaches Script gebastelt.

Damit gibt es z.B. folgende Ausgabe:
./speedtester.sh viewtopic.php?t=185440

Downloadgeschwindigkeit von viewtopic.php?t=185440
Messe 5 von 5 ...
Gemessene Downloadgeschwindigkeiten : 1,30 MB/s 1,23 MB/s 1,73 MB/s 1,16 MB/s 1,14 MB/s
Mittelwert der Downloadgeschwindigkeit : 1.31 MB/s
Wenn man dann einmal mit und ohne ratelimit misst, kann man den Erfolg, oder Misserfolg deutlich sehen

Code: Alles auswählen

#!/bin/bash
# bed 6.6.2024
# speedtester.sh
# $Revision: 1.5 $
# Überprüft, ob die Anzahl der Argumente korrekt ist

bold=$(tput bold)
reset=$(tput sgr0)

if [ $# -ne 1 ]; then
    echo "Fehler: Bitte geben Sie eine URL als Parameter an."
    echo "Beispiel: $0 https://example.com"
    exit 1
fi

# URL aus dem ersten Argument extrahieren
url=$1

# Überprüfen, ob die URL mit "http://" oder "https://" beginnt
if [[ $url != http://* && $url != https://* ]]; then
    echo "Fehler: Die URL muss mit 'http://' oder 'https://' beginnen."
    exit 1
fi

# Überprüfen, ob die URL mindestens einen Punkt enthält
if ! [[ $url =~ \. ]]; then
    echo "Fehler: Die URL muss mindestens einen Punkt enthalten."
    exit 1
fi
echo ""
# Array zum Speichern der Downloadgeschwindigkeiten
speeds=()

# Download-Datei
output="/dev/null"

# Temporäre Datei für wget
tempfile=$(mktemp)

# Anzahl der Messungen
num_measurements=5
echo -e "Downloadgeschwindigkeit von ${url}"
echo -e "Führe ${num_measurements} Messungen durch."
# Führe die Messungen durch
for i in $(seq 1 $num_measurements); do
    echo -n "Messe $i von $num_measurements ..."
    echo -ne "\r"

    # Verwende wget, um die Downloadgeschwindigkeit zu messen und das Ergebnis in eine Datei zu speichern
    wget $url -O $output 2> $tempfile

    # Extrahiere die Geschwindigkeit aus der Ausgabe
    speed=$(tail -2 $tempfile | grep /dev/null | cut -d\( -f2 | cut -d\) -f1)

    # Speichere die gemessene Geschwindigkeit im Array
    speeds+=("$speed")

    # Warte eine Sekunde vor der nächsten Messung
    sleep 1
done

# Berechne den Mittelwert der gemessenen Geschwindigkeiten
sum=0
total_units="KB/s"

for speed in "${speeds[@]}"; do
    # Entferne das MB/s oder KB/s für die Berechnung und ersetze das Komma durch einen Punkt
    value=$(echo $speed | sed 's/[A-Za-z\/]//g' | sed 's/,/./g')

    # Wenn die Geschwindigkeit in MB/s angegeben ist, in KB/s umrechnen und die Einheit ändern
    if [[ $speed == *MB/s ]]; then
        value=$(echo "$value * 1024" | bc -l)
        total_units="MB/s"
    fi

    sum=$(echo "$sum + $value" | bc -l)
done
rm $tempfile

mean=$(echo "scale=2; $sum / $num_measurements" | bc -l)

# Ausgabe der Messergebnisse
echo
echo -e "Gemessene Downloadgeschwindigkeiten    : ${speeds[@]}"

# Konvertiere den Mittelwert entsprechend zurück
if [ "$total_units" == "MB/s" ]; then
    mean=$(echo "scale=2; $mean / 1024" | bc -l)
fi

echo -e "Mittelwert der Downloadgeschwindigkeit : ${bold}${mean} ${total_units}${reset}"
Das Gerüst und die meisten Kommentare sind mit Hilfe von GPT 4o entstanden. Das spart viel Zeit.
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 23.10.2024 15:33:52

Ein SSH-Tunnelscript für die Verwendung mit Debianremmina.

Manchmal möchte man sich zu einem System verbinden, das nicht direkt erreichbar ist. Dann braucht es einen Befehl, der einem ein Portforwarding aktiviert. Damit das Fernsteuerungs-GUI remmina sich auf klick verbinden kann, benötigt es ein Script, dass den jeweilligen Tunnel aufbaut.

Das Script setzt voaus, dass eine schlüsselbasierte automatische Anmeldung zu dem SSH-Ziel konfiguriert ist.

Hier ein Beispielscript dazu:

Code: Alles auswählen

#!/bin/bash

export PATH=/bin:/usr/bin:$HOME/bin
export MYLOG="$(mktemp)"

# command to connect
MY_COMMAND=(ssh -L 127.0.0.1:33890:192.168.200.2:3389 my-ssh-server )

{ 
        # kill possible left over, old port forwarding connections
        pkill -9 -f "ssh .*echo ssh_connected"
        ssh "${MY_COMMAND[@]}" 'bash -c "echo ssh_connected; while :;do echo -n .;sleep 10;done"'

} >$MYLOG 2>&1 &

# remember PID of background process, wait 1 hour and then end it
MYPID="$!"
echo "waiting 1h before killing pid $MYPID" >>/tmp/tx1.log

{ 
        sleep 3600
        kill -TERM $MYPID
} >$MYLOG 2>&1 &

# loop-wait until string "ssh_connected" is in log file
while ! fgrep -q ssh_connected $MYLOG ; do
        sleep 1
done

# cleanup: delete the log file at the end 
# comment out, if you need the log for debugging
rm -f $MYLOG
Das Script baut eine Verbindung zu irgend einem SSH-Server auf, mit einem entsprechenden Portforward, setzt das ganze dann direkt in den Hintergrund und sobald der Text ssh_connected im eigenen Log auftaucht, beendet es sich und remmina kann die Verbindung per RDP oder was auch immer aufbauen. Zusätzlich beendet es nach einer Stunde den Prozess wieder, falls er denn noch da sein sollte.

Die Warteschleife mit dem "ssh_connected" könnte man auch durch einen "sleep 10" ersetzen, aber ich möchte ungern bei jedem Verbindungsaufbau 10 Sekunden warten müssen.

Das MY_COMMAND muss jeweils individuell gesetzt werden. Hier verbindet sich der Befehl zu einem Rechner ("Recher A") per SSH und leitet den lokalen Port 33890 auf den entfernten Port 3389 weiter, der von dem Rechner A aus erreichbar ist. 3389/tcp ist der Port für RDP.

Benutzeravatar
Emess
Beiträge: 3758
Registriert: 07.11.2006 15:02:26
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Im schönen Odenwald
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von Emess » 23.10.2024 15:44:39

Das ist alles sehr interessant.
Ich frage mich dabei, ob es auch nützliche Scripts für Nicht-Administratoren gibt. Ohne jetzt spezielles im Sinn zu haben?
Debian Testing (bleibt es auch)
Debian Bookworm KDE Plasma 5x Kernel 6.1.0-21-amd64 (64-bit)
Notebook HP ZBook 17 G2
Quadro K3100M/PCIe/SSE2

http://www.emess62.de

fischig
Beiträge: 4115
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von fischig » 23.10.2024 18:28:48

Emess hat geschrieben:Ich frage mich dabei, ob es auch nützliche Scripts für Nicht-Administratoren gibt.
Ich vermute du meinst ob es scripts für nicht-Administratoren Administratoren gibt.
Ist halt so die Frage, was für wen Alltag ist, bzw. wer sich vorzustellen vermag, dass es jenseits des eigenen andere Alltage geben mag :wink:

Benutzeravatar
Emess
Beiträge: 3758
Registriert: 07.11.2006 15:02:26
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Im schönen Odenwald
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von Emess » 23.10.2024 22:08:52

fischig hat geschrieben: ↑ zum Beitrag ↑
23.10.2024 18:28:48
Emess hat geschrieben:Ich frage mich dabei, ob es auch nützliche Scripts für Nicht-Administratoren gibt.
Ich vermute du meinst ob es scripts für nicht-Administratoren Administratoren gibt.
Ist halt so die Frage, was für wen Alltag ist, bzw. wer sich vorzustellen vermag, dass es jenseits des eigenen andere Alltage geben mag :wink:
Dann meld ich mich hier wieder. Wenn mir ein Kind in den Brunnen gefallen ist. Was z.Z. und zum Glück nicht gerade der Fall ist
Debian Testing (bleibt es auch)
Debian Bookworm KDE Plasma 5x Kernel 6.1.0-21-amd64 (64-bit)
Notebook HP ZBook 17 G2
Quadro K3100M/PCIe/SSE2

http://www.emess62.de

uname
Beiträge: 12396
Registriert: 03.06.2008 09:33:02

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von uname » 24.10.2024 08:00:58

Da es hier ja um selbstgestrickte Scripte für die Administration wie z. B. SSH-Tunnelscripte und auch Tunneln von grafischen Anwendungen geht, wollte ich an dieser Stelle an meine rein konsolenbaiserte Debiantmux-Fernwartung im Adventskalenderbeitrag vom 11.12.2022 erinnern. Hierbei müsst ihr erst mal ein paar Seiten in dem Artikel überspringen. Interessant wird es dann ab Beispiel 5 - Eigener Tmux-Benutzer tmux mit Restricted Shell . Vielleicht ist es ja für jemanden nützlich. Ich selbst habe es aber auch noch nie genutzt. ;-)

Kurz zusammengefasst:

Alice benötigt Support. Alice ist hinter ein NAT. Es muss bei ihr ein SSH-Server (nur localhost) mit SSH-Portforwarding installiert sein. Bob muss über einen aus dem Internet erreichbaren SSH-Server wohl auch mit Port-Forwarding verfügen. Bei Bob ist Debiantmux installiert. Zudem gibt es einen Benutzer "tmux" mit einer Restricted Shell.

/etc/passwd bei Bob:

Code: Alles auswählen

tmux:x:1007:1008::/home/tmux:/usr/local/bin/tmuxshell
/usr/local/bin/tmuxshell bei Bob:

Code: Alles auswählen

#!/bin/bash
if [ -z $TMUX ];   then                 
  /usr/bin/tmux attach -t tmux || /usr/bin/tmux new -s tmux
else       
  /bin/bash
fi
Alice und Bob treffen sich auf dem aus dem Internet erreichbaren SSH-Server von Bob mit dem Benutzer "tmux".

Aufruf Alice (bei Verwendung von SSH-Keys kein Passwort notwendig):

Code: Alles auswählen

ssh -R 2222:localhost:22 tmux@server-von-bob
Zusammen wechseln sie dann durch den Tunnel zurück zum Rechner von Alice.

Code: Alles auswählen

ssh alice@localhost -p 2222 
Vorteil ist vor allen, dass der Rechner von Alice nicht dauerhaft von Bob erreichbar ist. Es ist nur eine überwachte Administration möglich. Bob muss das Passwort von Alice nicht kennen. Natürlich können aber auch hier SSH-Keys verwendet werden.

Evtl. sollte Bob Maßnahmen ergreifen, dass Alice nicht ungefragt den Benutzer "tmux" nutzt. Vielleicht wäre diese Anpassung sinnvoll. Vielleicht mag es jemand ausprobieren.

/etc/passwd bei Bob (direkter Login zurück zu Alice):

Code: Alles auswählen

#!/bin/bash
if [ -z $TMUX ];   then                 
  /usr/bin/tmux attach -t tmux || /usr/bin/tmux new -s tmux
else       
  exec /bin/ssh alice@localhost -p 2222
fi

Benutzeravatar
whisper
Beiträge: 3373
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 13.11.2024 12:08:20

eMail senden ohne installiertes Mailsystem

geht nicht!" höre ich euch sagen.
Doch, unter wenigen Voraussetzungen:
  • Ein zweiter Rechner im Netzwerk, der eMail senden kann muß verfügbar sein
  • ssh login via public Key Verfahren muss eingerichtet sein und funktionieren
Gegeben sei
ServerA:
hier läuft ein minimalistisches Linux z.B. Debian ohne eMail
Die Installation würde 70MB oder mehr kosten.
Da der Platz knapp ist, soll ein Workaround her.

ServerB
Der Rechner kann eMails versenden.
Test:
echo "Hallo hier ist Server B"|mail -s "Test eMail von Server B" -t meine.mail@domain.de

Das muss funktionieren, sonst erst das fixen, bevor nun der Trick kommt.

Server A
Hier soll z.B. ein Backup Programm laufen, welches im Fehlerfall eine Nachricht senden können soll.

Workaround

Code: Alles auswählen

#im Script:
cat "$LOG"|$(ssh user@serverB mail -s "Fehler beim Backup von $(hostname)" -t admin@domain.de)

#oder auch direkt in der Console
cat backup.log| ssh user@serverB mail -s "Test email von der console -t admin@domain.de
Easy, oder?
(Möglicherweise wäre auch ein Türchen im Adventskalender gewesen.)
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

Benutzeravatar
thunder11
Beiträge: 2146
Registriert: 19.04.2023 09:08:30

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von thunder11 » 13.11.2024 13:25:02

Mal was ganz Profanes für das tägliche Upgrade (trixie / sid) für Tippfaule:

Mini- Skript, gespeichet in /usr/local/bin/:

Code: Alles auswählen

#!/bin/bash

pkexec xfce4-terminal -e "aptitude update"
pkexec xfce4-terminal -e "aptitude full-upgrade" 
geany /var/log/aptitude

exit
Das Terminal kann man natürlich ebenso wie den Text-Editor ändern.

Dazu braucht man noch eine Policy:
Ich will noch das Root-PW engeben.
Das kann man aber ändern, indem man die Zeile

Code: Alles auswählen

 <allow_active>auth_admin_keep</allow_active>
in
 <allow_active>yes_keep</allow_active>
ändert.
Die Policy:
cat /usr/share/polkit-1/actions/org.xfce.xfce4-terminal.policy

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
    <action id="org.freedesktop.policykit.pkexec.xfce4-terminal">
    <description>Run xfce4-terminal program</description>
    <message>Authentication is required to run xfce4-terminal</message>
    <icon_name>accessories-text-editor</icon_name>
    <defaults>
        <allow_any>auth_admin</allow_any>
        <allow_inactive>auth_admin</allow_inactive>
        <allow_active>auth_admin_keep</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/xfce4-terminal</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
    </action>
</policyconfig>

Dann noch ein Icon (Starter) auf dem Desktop erstellen, mit dem man das Obige Skript aufruft,
und schon ist man die Tipperei los. :mrgreen:
Morgens eine Klick und schon geht es los.

uname
Beiträge: 12396
Registriert: 03.06.2008 09:33:02

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von uname » 13.11.2024 13:53:25

thunder11 hat geschrieben:Mal was ganz Profanes für das tägliche Upgrade (trixie / sid) für Tippfaule:
Wer ganz faul ist, lässt die Upgrades einfach im Hintergrund durchlaufen siehe https://wiki.debian.org/UnattendedUpgrades . Vielleicht kann jemand geeignete Konfigurationen für Stable sowie und Testing/Sid posten.

Benutzeravatar
thunder11
Beiträge: 2146
Registriert: 19.04.2023 09:08:30

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von thunder11 » 13.11.2024 14:27:11

uname hat geschrieben: ↑ zum Beitrag ↑
13.11.2024 13:53:25
Vielleicht kann jemand geeignete Konfigurationen für Stable sowie und Testing/Sid posten.
Ich glaube, das geht nicht, da ja häufig beim full-upgrade (Testing / Sid ) auch ein Löschen von Paketen notwendig ist.
Das würde ich mir auch nicht antun wollen genauso wenig wie den Parameter "y"

Da kann sowas kommen, und da möchte ich schon sehen, was gemacht werden soll:

Code: Alles auswählen

Mon, Nov  4 2024 18:03:12 +0100
Will install 45 packages, and remove 8 packages.
177 MB of disk space will be used
========================================
[REMOVE, NOT USED] gnome-desktop3-data:amd64 44.1-1
[REMOVE, NOT USED] libdmapsharing-4.0-3t64:amd64 3.9.13-3
[REMOVE, NOT USED] libgnome-desktop-3-20t64:amd64 44.1-1
[REMOVE, NOT USED] libgom-1.0-0t64:amd64 0.5.3-1
[REMOVE, NOT USED] libmediaart-2.0-0:amd64 1.9.6-1+b2
[REMOVE, NOT USED] liboauth0:amd64 1.0.3-5+b2
[REMOVE, NOT USED] libtracker-sparql-3.0-0:amd64 3.7.3-2+b1
[REMOVE, NOT USED] libxkbregistry0:amd64 1.6.0-1+b2
[INSTALL, DEPENDENCIES] linux-headers-6.11.5-amd64:amd64 6.11.5-1
[INSTALL, DEPENDENCIES] linux-headers-6.11.5-common:amd64 6.11.5-1
[INSTALL, DEPENDENCIES] linux-image-6.11.5-amd64:amd64 6.11.5-1
[INSTALL, DEPENDENCIES] linux-kbuild-6.11.5:amd64 6.11.5-1
[UPGRADE] firmware-amd-graphics:amd64 20240709-2 -> 20240909-2
[UPGRADE] firmware-intel-graphics:amd64 20240709-2 -> 20240909-2
[UPGRADE] firmware-intel-misc:amd64 20240709-2 -> 20240909-2
[UPGRADE] firmware-intel-sound:amd64 20240709-2 -> 20240909-2
[UPGRADE] firmware-iwlwifi:amd64 20240709-2 -> 20240909-2
[UPGRADE] firmware-linux:amd64 20240709-2 -> 20240909-2
[UPGRADE] firmware-linux-nonfree:amd64 20240709-2 -> 20240909-2
[UPGRADE] firmware-mediatek:amd64 20240709-2 -> 20240909-2
[UPGRADE] firmware-misc-nonfree:amd64 20240709-2 -> 20240909-2
[UPGRADE] firmware-nvidia-graphics:amd64 20240709-2 -> 20240909-2
[UPGRADE] fuseiso:amd64 20070708-5 -> 20070708-6
[UPGRADE] gparted:amd64 1.5.0-1+b1 -> 1.6.0-1
[UPGRADE] gparted-common:amd64 1.5.0-1 -> 1.6.0-1
[UPGRADE] libcpupower1:amd64 6.11.4-1 -> 6.11.5-1
[UPGRADE] libgsl28:amd64 2.8+dfsg-3 -> 2.8+dfsg-4
[UPGRADE] libgslcblas0:amd64 2.8+dfsg-3 -> 2.8+dfsg-4
[UPGRADE] libnss-myhostname:amd64 256.7-2 -> 256.7-3
[UPGRADE] libnss-resolve:amd64 256.7-2 -> 256.7-3
[UPGRADE] libnss-systemd:amd64 256.7-2 -> 256.7-3
[UPGRADE] libpam-systemd:amd64 256.7-2 -> 256.7-3
[UPGRADE] libqt6multimedia6:amd64 6.7.2-4 -> 6.7.2-5
[UPGRADE] libqt6qml6:amd64 6.7.2+dfsg-9 -> 6.7.2+dfsg-10
[UPGRADE] libqt6qmlmodels6:amd64 6.7.2+dfsg-9 -> 6.7.2+dfsg-10
[UPGRADE] libqt6quick6:amd64 6.7.2+dfsg-9 -> 6.7.2+dfsg-10
[UPGRADE] libspeex1:amd64 1.2.1-2+b2 -> 1.2.1-3
[UPGRADE] libsystemd-shared:amd64 256.7-2 -> 256.7-3
[UPGRADE] libsystemd0:amd64 256.7-2 -> 256.7-3
[UPGRADE] libudev-dev:amd64 256.7-2 -> 256.7-3
[UPGRADE] libudev1:amd64 256.7-2 -> 256.7-3
[UPGRADE] linux-cpupower:amd64 6.11.4-1 -> 6.11.5-1
[UPGRADE] linux-headers-amd64:amd64 6.11.4-1 -> 6.11.5-1
[UPGRADE] linux-image-amd64:amd64 6.11.4-1 -> 6.11.5-1
[UPGRADE] linux-libc-dev:amd64 6.11.4-1 -> 6.11.5-1
[UPGRADE] luit:amd64 2.0.20221028-1 -> 2.0.20240910-1
[UPGRADE] speex:amd64 1.2.1-2+b2 -> 1.2.1-3
[UPGRADE] systemd:amd64 256.7-2 -> 256.7-3
[UPGRADE] systemd-cryptsetup:amd64 256.7-2 -> 256.7-3
[UPGRADE] systemd-resolved:amd64 256.7-2 -> 256.7-3
[UPGRADE] systemd-sysv:amd64 256.7-2 -> 256.7-3
[UPGRADE] systemd-timesyncd:amd64 256.7-2 -> 256.7-3
[UPGRADE] udev:amd64 256.7-2 -> 256.7-3
Bei Ubuntu wird dazu folgendes gesagt:Allerdings scheine mir die Möglichkeiten sich nur auf geänderte
Konfigurationsdateien zu beziehen:https://wiki.ubuntuusers.de/Aktualisier ... iguration/
Probleme
[.......]
Ein Update des Paketes enthält eine neue Version der Konfigurationsdatei, die sich von der ursprünglichen unterscheidet. Es erfolgt eine Benachrichtigung durch dpkg, bei der der Administrator nun selbst entscheiden muss, ob er seine eigene, modifizierte Datei behalten oder die neue Datei aus dem aktualisierten Paket nehmen will. Allerdings lässt sich auch dies automatisieren 🇬🇧, indem die Datei /etc/apt/apt.conf.d/local erstellt wird. Soll standardmäßig die jeweilige Konfigurationsdatei nicht verändert werden und dpkg alleine entscheiden, ob eine Nachfrage erscheinen soll, empfiehlt sich folgender Dateiinhalt:
[......]

uname
Beiträge: 12396
Registriert: 03.06.2008 09:33:02

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von uname » 13.11.2024 14:44:42

Das stimmt natürlich. Ich habe mir dein Script noch mal angeschaut. Brauchst du wirklich grafische Anwendungen? Könntest du nicht dein Xfce4-Terminal manuell öffnen und im Terminal ein Script starten? Dann würden "aptitude update" und "aptitude full-upgrade" durchlaufen und anschließend würde ich vielleicht /var/log/aptitude im Vim readonly oder per less anzeigen lassen. Viel mehr macht dein Script doch auch nicht, oder?

Dein Script damit niemand hochscrollen muss:

Code: Alles auswählen

#!/bin/bash

pkexec xfce4-terminal -e "aptitude update"
pkexec xfce4-terminal -e "aptitude full-upgrade" 
geany /var/log/aptitude

exit

Benutzeravatar
thunder11
Beiträge: 2146
Registriert: 19.04.2023 09:08:30

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von thunder11 » 13.11.2024 15:02:48

Noch ne nette Sache für VPN. Ich wechsele häufig das Land, je nachdem was nötig ist.

Ein welchen Land (IP) bin ich gerade ?

Code: Alles auswählen

#!/bin/bash
Message=$(geoiplookup $(curl -4 ifconfig.co)|cut -c 27-40)
notify-send "IP-INFO - PUREVPN VIA" -i "/home/thunder/Bilder/Icons/Purevpn_IP.png" $Message 

# für IP funktionieren auch:
# dig +short myip.opendns.com @resolver4.opendns.com
# 146.70.111.138

# $ curl -4 http://canhazip.com
# 146.70.111.138

# lynx --dump http://checkip.dyndns.org/
# Current IP Address: 146.70.111.138
Das ergibt dass eine hübsche Benachrichtigung in XFCE:
5150
Dazu gehört natürlich ein Starter mit einem netten Icon auf dem Desktop
Ich habe das mit dem Land gemacht (Debiangeoip-bin + Debiangeoip-database) da mir die IP-Adresse oft erstmal wenig sagen.

Antworten