Nützliche selbstgestrickte Scripte für die Alltagsadministration
- 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
Ich habe eines zum Aufbau von SSH Tunneln, welches ich regelmässig nutze. Achtung "KnownHost" muss dazu unverschlüsselt seien.
ein weiteres zum auslesen, der Gültigkeit von Zertifikaten die übers System verteilt sind.
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
# 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
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Script: Load- und temperaturabhängige CPU-Frequenzsteuerung
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.
Beispiel der Logausgabe
So wirkt sich dass dann im Betrieb aus:
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
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
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
Ich bekomme da eine Fehlermeldung bei dem CPU Script
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
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>'
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
- 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
Im Head des Scriptes stehen ein paar Installationsanweisungen. Es müssen Ruby-Module installiert werden:speefak hat geschrieben:03.04.2024 11:48:53Ich 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>'
Code: Alles auswählen
# gem install sys-cpu awesome_print find
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
whisper hat geschrieben:25.03.2021 20:13:351+ 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:Die Datei dateirechte.txt wird täglich mitgesichert und hilft versehentliche Änderungen zu reparierenCode: 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
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 . 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.
- 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
Danke, läuft immer noch und hat mit der Zeit schon ein paar mal geholfen.speefak hat geschrieben:03.04.2024 11:54:56Das ist gar nicht so verkehrt - mir ist auch schon mal aus versehen ein chown -R root:root / durchgelaufen - war nicht so der dolle . 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.
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt.
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
Pakete sind installiert, Ruby Pakete zu cpufrequtilsheisenberg hat geschrieben:03.04.2024 11:51:27Im Head des Scriptes stehen ein paar Installationsanweisungen. Es müssen Ruby-Module installiert werden:speefak hat geschrieben:03.04.2024 11:48:53Ich 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>'
cpufrequtils müssen auch installiert sein.Code: Alles auswählen
# gem install sys-cpu awesome_print find
- 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
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
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
Dokus in Scripten lese ich als erstes hab's als root und User probiert. Werd's die Tage nochmal inner frischen D12 VM probieren.
- 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
Was ist bei Dir die Ausgabe von:
Die Fehlermeldung von Dir bedeutet, dass das Modul nicht geladen werden könnte, weil nicht gefunden.
Code: Alles auswählen
gem install sys-cpu awesome_print find
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
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
- 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
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.
- 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
Ich habe mit dem module ratelimit 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 wget im Prinzip die Downloadgeschwindigkeit anzeigt, habe ich damit ein einfaches Script gebastelt.
Damit gibt es z.B. folgende Ausgabe:
Das Gerüst und die meisten Kommentare sind mit Hilfe von GPT 4o entstanden. Das spart viel Zeit.
Damit kann man die Ausliefergeschwindigkeit von Webseiten und auch kompletter Domains kontrollieren, also verlangsamen.
-doch wie testet man das komfortabel?
Da wget im Prinzip die Downloadgeschwindigkeit anzeigt, habe ich damit ein einfaches Script gebastelt.
Damit gibt es z.B. folgende Ausgabe:
Wenn man dann einmal mit und ohne ratelimit misst, kann man den Erfolg, oder Misserfolg deutlich sehen./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
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}"
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt.
- 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
Ein SSH-Tunnelscript für die Verwendung mit remmina.
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:
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.
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
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.
- 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
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?
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
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
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
Ich vermute du meinst ob es scripts für nicht-Administratoren Administratoren gibt.Emess hat geschrieben:Ich frage mich dabei, ob es auch nützliche Scripts für Nicht-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
- 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
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 istfischig hat geschrieben:23.10.2024 18:28:48Ich vermute du meinst ob es scripts für nicht-Administratoren Administratoren gibt.Emess hat geschrieben:Ich frage mich dabei, ob es auch nützliche Scripts für Nicht-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
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
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
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
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 tmux-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 tmux installiert. Zudem gibt es einen Benutzer "tmux" mit einer Restricted Shell.
/etc/passwd bei Bob:
/usr/local/bin/tmuxshell bei Bob:
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):
Zusammen wechseln sie dann durch den Tunnel zurück zum Rechner von Alice.
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):
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 tmux 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
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
Aufruf Alice (bei Verwendung von SSH-Keys kein Passwort notwendig):
Code: Alles auswählen
ssh -R 2222:localhost:22 tmux@server-von-bob
Code: Alles auswählen
ssh alice@localhost -p 2222
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
- 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
eMail senden ohne installiertes Mailsystem
„geht nicht!" höre ich euch sagen.
Doch, unter wenigen Voraussetzungen:
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
Easy, oder?
(Möglicherweise wäre auch ein Türchen im Adventskalender gewesen.)
„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
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
(Möglicherweise wäre auch ein Türchen im Adventskalender gewesen.)
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt.
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
Mal was ganz Profanes für das tägliche Upgrade (trixie / sid) für Tippfaule:
Mini- Skript, gespeichet in /usr/local/bin/:
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
ändert.
Die Policy:
cat /usr/share/polkit-1/actions/org.xfce.xfce4-terminal.policy
Dann noch ein Icon (Starter) auf dem Desktop erstellen, mit dem man das Obige Skript aufruft,
und schon ist man die Tipperei los.
Morgens eine Klick und schon geht es los.
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
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>
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>
und schon ist man die Tipperei los.
Morgens eine Klick und schon geht es los.
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
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.thunder11 hat geschrieben:Mal was ganz Profanes für das tägliche Upgrade (trixie / sid) für Tippfaule:
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
Ich glaube, das geht nicht, da ja häufig beim full-upgrade (Testing / Sid ) auch ein Löschen von Paketen notwendig ist.uname hat geschrieben:13.11.2024 13:53:25Vielleicht kann jemand geeignete Konfigurationen für Stable sowie und Testing/Sid posten.
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
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:
[......]
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
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:
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
Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration
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 ?
Das ergibt dass eine hübsche Benachrichtigung in XFCE:
Dazu gehört natürlich ein Starter mit einem netten Icon auf dem Desktop
Ich habe das mit dem Land gemacht (geoip-bin + geoip-database) da mir die IP-Adresse oft erstmal wenig sagen.
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
Dazu gehört natürlich ein Starter mit einem netten Icon auf dem Desktop
Ich habe das mit dem Land gemacht (geoip-bin + geoip-database) da mir die IP-Adresse oft erstmal wenig sagen.