Condividiamoli qui!

P.S.
Scusate l'immensa lunghezza del post :lkib:

#1 30 Maggio 2019, 08:54:29 Ultima modifica: 30 Maggio 2019, 08:57:36 di Cire
 XD Aggiornare la mirrorlist
reflector --country 'Italy' --country 'Germany' --latest 50 --age 24 --sort rate --save /etc/pacman.d/mirrorlist;  rm -f /etc/pacman.d/mirrorlist.pacnew


XD Pulizia arch
sudo pacman-optimize
sudo pacman -Rsn $(pacman -Qqdt)
sudo paccache -r -u
sudo pacman -Sc


Poi ho gli script per montare le condivisioni di rete.

Edit:
E questo
#! /bin/bash
#Da terminale spostarsi nella cartella e modificare il grep qui sotto
mkdir estratti
grep -r cliente
#cambiare bash con termine di ricerca
FILE_LIST=$(grep -r cliente | cut -d':' -f1)
for file in ${FILE_LIST[@]}; do cp $file estratti/$file ; done

Che non ricordo a cosa servisse esattamente (commentato male) ma doveva essere qualcosa per cercare nei file determinate parole.

Forse per recuperare tutte le mail destinate a un cliente dal MailEnable, il nostro vecchio server di posta.

#2 30 Maggio 2019, 10:28:43 Ultima modifica: 30 Maggio 2019, 12:12:59 di TonyWhite
Uso questo script per montare una cartella remota tramite SSH.
Interfaccia Zenity
Bisogna usare una chiave abilitata dal server.

#!/bin/bash

# Configuration
REMOTE_USER="admin"
REMOTE_IP="11.22.33.44"
REMOTE_PORT="22"
REMOTE_FOLDER="/data"
LOCAL_FOLDER="/mnt/nas_remoto"
LOCAL_KEY="~/.ssh/chiavi/nas_remoto" # Create key with ssh-keygen

# Messages
CONNECTION_NAME="NAS Remoto"
QUESTION_CONNECT="Vuoi connetterti al NAS Remoto?"
QUESTION_DISCONNECT="Il NAS Remoto è già connesso.\n\nVuoi disconnetterti?"
WAIT_CONNECTION="Connessione su NAS Remoto..."
WAIT_DISCONNECTION="Chiusura connessione su NAS Remoto..."
INFO_CONNECTION_OK="Connessione stabilita con successo!"
INFO_CONNECTION_KO="Errore di connessione"
INFO_DISCONNECTION_OK="Connessione chiusa correttamente"
INFO_DISCONNECTION_KO="Errore durante la chiusura della connessione"

PARAMS=$*

function main()
{
  if [[ ${PARAMS[0]} == "autostart" ]];then
    `silent_connection`
  else
    `manage_connection`
  fi
}

function silent_connection()
{
  if [[ `check_connection` == false ]]; then
    `start_connection`
  fi
}

function manage_connection()
{
  if [[ `check_connection` == false ]]; then
    zenity --title="${CONNECTION_NAME}" --question --text="${QUESTION_CONNECT}"
    if [[ $? == 0 ]]; then
      `zen_start_connection`
    fi
  else
    zenity --title="${CONNECTION_NAME}" --question --text="${QUESTION_DISCONNECT}"
    if [[ $? == 0 ]]; then
      `zen_stop_connection`
    fi
  fi
}

# Check if the connection exists
function check_connection()
{
  COUNT_CONNECTION=`df -h | grep ${REMOTE_USER}@${REMOTE_IP} | grep -c "${LOCAL_FOLDER}"`
  if [[ ${COUNT_CONNECTION} == 1 ]]; then
    echo true
  else
    echo false
  fi
}

function start_connection()
{
  sshfs ${REMOTE_USER}@${REMOTE_IP}:${REMOTE_FOLDER} "${LOCAL_FOLDER}" -p ${REMOTE_PORT} -o IdentityFile="${LOCAL_KEY}"
}

function stop_connection()
{
  gksudo umount "${LOCAL_FOLDER}"
}


function zen_start_connection()
{
  (`start_connection`) | zenity --title="SSH @ ${CONNECTION_NAME}" --progress --pulsate --auto-close --text="${WAIT_CONNECTION}"
 
  if [[ `check_connection` == true ]]; then
    zenity --title="SSH @ ${CONNECTION_NAME}" --info --text="${INFO_CONNECTION_OK}"
  else
    zenity --title="SSH @ ${CONNECTION_NAME}" --info --text="${INFO_CONNECTION_KO}"
  fi
}

function zen_stop_connection()
{
  (`stop_connection`) | zenity --title="SSH @ ${CONNECTION_NAME}" --progress --pulsate --auto-close --text="${WAIT_DISCONNECTION}"
 
  if [[ `check_connection` == false ]]; then
    zenity --title="SSH @ ${CONNECTION_NAME}" --info --text="${INFO_DISCONNECTION_OK}"
  else
    zenity --title="SSH @ ${CONNECTION_NAME}" --info --text="${INFO_DISCONNECTION_KO}"
  fi
}

main


Chi preferisce QT, può utilizzare Qarma al posto di Zenity.

EDIT:
Cosa moto importante! Crea questo file sul client per mantenere la connessione attiva. Di default i server SSH effettuano le disconnessioni automaticamente. È una brutta cosa quando stai lavorando e sei costretto a riconnetterti ripetutamente... e magari devi forzare la chiusura di una connessione fantasma.
Codice (~/.ssh/config) Seleziona
Host *
  ServerAliveInterval 60

Aggiungo due comandi per chiarire il commento "Create key with ssh-keygen" che ho scritto nel post precedente.
Una volta creata la chiave, il server deve anche riconoscerla, altrimenti il client può provare all'infinito senza risultato! :asd:

Apri il terminale, entra nella cartella ~/.ssh e crea la chiave
ssh-keygen
Ti chiederà:

  • Dove salvare le chiavi
  • Quale nome dare alle chiavi
  • Quale password utilizzare: è una password per poter usare la chiave. Non è la password di accesso all'account e non devi inserire quella! Se lasci il campo vuoto, potrai fare il login con la chiave senza scrivere la password.
È stata creata una coppia di chiavi: una pubblica e una privata.

Ora devi registrare la chiave pubblica sul server
ssh-copy-id -i mykey.pub user@server

Nota
Questa operazione, solitamente, è di competenza esclusiva dell'amministratore del server.

#4 27 Maggio 2020, 17:36:20 Ultima modifica: 28 Maggio 2020, 10:34:51 di TonyWhite
Stavo mettendo mani al server dell'ufficio, quando mi imbatto in una cosa che bla bla bla, arrivo subito al dunque :asd:

Nei miei script voglio usare "sudo" senza usare il terminale.

Ho usato l'approccio agnostico, così posso usare questa soluzione anche per il DE ZEN. E poi questa soluzione è ideale per il server, così gli eventuali aggiornamenti di pkexec non mi potranno dare fastidio.
Semplicità d'uso: niente terminale.
Nessuno strumento obsoleto: gksu è andato a concimare i cipressi
Nessun vincolo dal DE: pkexec ha molte varianti per vari DE


Fra le varie soluzioni che ho trovato, c'è la possibilità di cambiare un file di configurazione di sudo per inserire lo script per la GUI, ma ho voluto lasciar perdere: mi sembrava una soluzione un po' sporca.

Un'altra soluzione era quella di creare 3 script:

  • GUI per sudo
  • Launcher per il mio script con sudo
  • Il mio script
Nel launcher decido la GUI per sudo, ed evito di modificare un file di configurazione (che è decisamente delicato).
Con questa soluzione devo avere a che fare con 3 percorsi differenti, e dovrò cambiarli ogni volta che gli script cambiano nome o posizione. Richiede molta manutenzione.

Ecco la soluzione più pulita che sono riuscito a trovare:

  • GUI per sudo
  • Il mio script, che funge anche da launcher
Nel mio script decido la GUI per sudo, quindi mi sono risparmiato la modifica al file di configurazione e il doppio script.
Con questa soluzione dovrò conoscere solo la posizione dello script per la GUI di Zenity, mentre il launcher "si trova da solo" e sono libero di spostare e rinominare il mio script senza problemi.


Questo script funge da GUI per sudo.
Codice ("/usr/bin/zen-sudo") Seleziona
#!/bin/bash
zenity --password --title="ZEN Security"


Questo script chiede la password e si avvia come root solo se la password è corretta.
Come vedete, è tutto commentato e potete adattarlo al volo.
#!/bin/bash

# DEPENDENCIES
# coreutils
# sudo
# zenity
# zen-sudo (simple script)

function main()                                                                                    # Main function
{
  zenity --info --ellipsize --text="I am `whoami`\nand the script works flawlessly"                # Change it with your code
}

if [[ "`whoami`" == "root" ]]; then                                                                # I am root?
  main                                                                                             # YES! Start main function with root permissions!
else                                                                                               # NO? In this case...
  export SUDO_ASKPASS="/usr/bin/zen-sudo"                                                          # Define Zenity for sudo GUI
  REALPATH="$(realpath "$0")"                                                                      # Know yourself
  sudo -A "${REALPATH}"                                                                            # Launch itself with sudo (and ask password with Zenity if need)
  SUCCESS="$?"                                                                                     # Read result of sudo: 0 should be great
  if [[ "${SUCCESS}" != "0" ]]; then                                                               # If wrong with sudo...
    zenity --error --ellipsize --title="Something" --text="Can't execute Something"                # Show message.
  else                                                                                             # And if no problems...
    zenity --info --ellipsize --title="Something" --text="I am `whoami`\nand script has ended"     # Show another message.
  fi
fi

Ora sono pronto per usare "sudo" con Zenity sul server di lavoro senza il timore che un aggiornamento (o cambio di DE) possa impedirne il corretto funzionamento.

EDIT:
Ho aggiornato il secondo script. Ora sono consentiti i nomi con gli spazi.

EDIT 2
Sto modificando tutto per fare un unico script. Sarà semplice da usare come il vecchio gksudo, ma con delle migliorie.

Ho preso Doom Eternal, e dato che ha un sacco di comandi che posso mappare sul mouse, ma ne rileva solo 5 su 8, ho creato uno script Python per riassegnare i pulsanti come tasti della tastiera

#!/usr/bin/env python
'''
Piccolo driver che assegna ad alcuni pulsanti extra del mouse la pressione di tasti della tastiera, per permettere di essere usati nei giochi che ne supportano un numero limitato (tipo i nuovi doom)
Questi gli scancodes dell'Elecom Deft Pro, per rilevare quelli specifici del proprio mouse usare la routine print(event) per scoprirla:
Tasto sinistro: code 272
Pressione rotella: code 274
Tasto destro: code 273
Rotella (scorrimento su/giù): code 11; value <0 per su e >0 per giù
Rotella (tilt sx/dx): code 12; value <0 per sx e >0 per dx
Tasto indietro: code 275
Tasto avanti: code 276
Tasto Fn1: code 277
Tasto Fn2: code 278
Tasto Fn3: code 279
'''

from evdev import InputDevice, categorize, ecodes, UInput
ui = UInput()

dev = InputDevice('/dev/input/by-id/usb-ELECOM_TrackBall_Mouse_DEFT_Pro_TrackBall-event-mouse')

for event in dev.read_loop():
#print(event)
if event.code == 274 : #Pressione Rotella
# Button status, 1 is down, 0 is up
if event.value == 1:
ui.write(ecodes.EV_KEY, ecodes.KEY_INSERT, 1)
elif event.value == 0:
ui.write(ecodes.EV_KEY, ecodes.KEY_INSERT, 0)
if event.code == 278 : #Fn2
# Button status, 1 is down, 0 is up
if event.value == 1:
ui.write(ecodes.EV_KEY, ecodes.KEY_HOME, 1)
elif event.value == 0:
ui.write(ecodes.EV_KEY, ecodes.KEY_HOME, 0)
if event.code == 279 : #Fn3
if event.value == 1:
ui.write(ecodes.EV_KEY, ecodes.KEY_END, 1)
elif event.value == 0:
ui.write(ecodes.EV_KEY, ecodes.KEY_END, 0)
if event.code == 12 : #Tilt rotella
if event.value > 0: #Tilt Rotella destra
ui.write(ecodes.EV_KEY, ecodes.KEY_PAGEUP, 1)
ui.write(ecodes.EV_KEY, ecodes.KEY_PAGEUP, 0)
elif event.value < 0: #Tilt Rotella sinistra
ui.write(ecodes.EV_KEY, ecodes.KEY_PAGEDOWN, 1)
ui.write(ecodes.EV_KEY, ecodes.KEY_PAGEDOWN, 0)
ui.syn()
Il bere trionfa sempre sul male


Ultimamente pkexec ha sostituito i vecchi gksu e gksudo, ma ha bisogno di qualche piccolo accorgimento per avviare interfacce grafiche.

zen-sudo riprende il vecchio funzionamento di gksu e gksudo, e funziona su qualsiasi distribuzione Linux.

#!/bin/bash

# DEPENDENCIES
# findutils (xargs)
# neofetch
# sudo
# zenity

# FEATURES
# Can execute script with space in names
# zeroconfig: only 1 script for auto-configure & auto-execute
# It is DE agnostic!

#!/bin/bash
# Search for icon path from current icon theme
# Example:
# get_icon_path "system-shutdown" "22"
function get_icon_path()
{
  ICON_NAME=$1
  ICON_SIZE=$2
  OLD_IFS=$IFS
 
  # Detect icon theme
  IFS=" "
  FETCHINFO=(`neofetch --stdout | grep -m 1 -i "^Icons" | cut -f2 -d ':' | xargs | cut -f1 -d ' '`)
  ICON_THEME_NAME=""
  for ((INDEX=0 ; INDEX < ${#FETCHINFO[@]}; INDEX++)); do
    if [[ ${#ICON_THEME_NAME} -gt 0 ]]; then
      ICON_THEME_NAME+=" "
    fi
    ICON_THEME_NAME+="${FETCHINFO[$INDEX]}"
  done
 
  # Detect iherits themes
  VALID_ICONS_PATH=()                                        # Array of valid icons path
  VALID_THEMES_FOLDERS=()                                    # Array of valid themes folders
  VALID_THEMES_NAMES=("${ICON_THEME_NAME}")                  # Array of valid themes names
  INDEX_VALID_THEMES_NAMES=0                                 # Index for VALID_THEMES_NAMES array
  THEMES_FOLDERS=("/home/$USER/.icons/" "/usr/share/icons/") # Icon theme folders

  while [ $INDEX_VALID_THEMES_NAMES -lt ${#VALID_THEMES_NAMES[@]} ]; do
    for THEME_FOLDER in ${THEMES_FOLDERS[@]}; do
      if [[ -d "${THEME_FOLDER}${VALID_THEMES_NAMES[$INDEX_VALID_THEMES_NAMES]}" ]]; then
        VALID_THEMES_FOLDERS+=("${THEME_FOLDER}${VALID_THEMES_NAMES[$INDEX_VALID_THEMES_NAMES]}/")
       
        # Detect icon name in this theme
        IFS=$'\n'
        THEME_FOLDERS=(`ls -1 -R ${THEME_FOLDER}${VALID_THEMES_NAMES[$INDEX_VALID_THEMES_NAMES]} | grep "/"`)
        THEME_FOLDERS=("${THEME_FOLDERS[@]}")
        for THEME_SUBFOLDER in ${THEME_FOLDERS[@]}; do
          # Filter by size: exact or scalable
          if [[ "${THEME_SUBFOLDER}" == *"${ICON_SIZE}x${ICON_SIZE}"* ]] || [[ "${THEME_SUBFOLDER}" == *"scalable"* ]]; then
            THEME_SUBFOLDER=${THEME_SUBFOLDER::-1} # Remove last char ":"
            THEME_ICONS=(`ls -1 ${THEME_SUBFOLDER}/*${ICON_NAME}* 2>/dev/null`)
            if [[ "$?" != "0" ]]; then
              THEME_ICONS=() # Add icons only if they exists
            fi
            VALID_ICONS_PATH+=(${THEME_ICONS[@]})
          fi
        done
       
        # Detect Inherits themes in index.theme
        IFS="="
        INHERITS_ROW=(`cat ${THEME_FOLDER}${VALID_THEMES_NAMES[${INDEX_VALID_THEMES_NAMES}]}/index.theme | grep -i "^Inherits"`)
        IFS=$OLD_IFS
        INHERITS_THEMES=(`echo ${INHERITS_ROW[1]} | tr ',' ' '`) # Look for the comma as delimiter
       
        # Add inherits themes to VALID_THEMES_NAMES
        for INHERITS_THEME in ${INHERITS_THEMES[@]}; do
          NEW_THEME=true
          for VALID_THEME_NAME in ${VALID_THEMES_NAMES[@]}; do
            if [[ "${INHERITS_THEME}" == "${VALID_THEME_NAME}" ]]; then
              NEW_THEME=false
            fi
          done
          if [[ $NEW_THEME == true ]]; then
            VALID_THEMES_NAMES+=("${INHERITS_THEME}")
          fi
        done
      fi
    done
    INDEX_VALID_THEMES_NAMES=$((INDEX_VALID_THEMES_NAMES+1))
  done
 
  # Search icon in fallback paths
  IFS=$RETURN
  SHARE_ICONS=(`ls -1 /usr/share/icons/* | grep -i "${ICON_NAME}"`)
  SHARE_PIXMAPS=(`ls -1 /usr/share/pixmaps/* | grep -i "${ICON_NAME}"`)
  IFS=$OLD_IFS
  VALID_ICONS_PATH+=(${SHARE_ICONS[@]})
  VALID_ICONS_PATH+=(${SHARE_PIXMAPS[@]})
 
  # Scan valid paths to retrieve icon
  BEST_INDEX=0
  BEST_SCORE=${#VALID_ICONS_PATH[0]}
  BEST_ICON=""
  for ((INDEX=0 ; INDEX < ${#VALID_ICONS_PATH[@]}; INDEX++)); do
    # File must be an image
    if [[ "`xdg-mime query filetype ${VALID_ICONS_PATH[$INDEX]} | grep "^image" -c`" == "1" ]]; then
      RESULT=`basename ${VALID_ICONS_PATH[$INDEX]}`      # Remove path
      RESULT=`echo ${RESULT} | cut -f 1 -d '.'`          # Remove extension
      EXTRA_CHARS=${RESULT//$ICON_NAME/}                 # Remove icon name
      DIRTY=${#EXTRA_CHARS}
      if [[ $DIRTY -lt $BEST_SCORE ]]; then
        BEST_SCORE=${DIRTY}
        BEST_INDEX=${INDEX}
        BEST_ICON="${RESULT}"
        if [[ $DIRTY == 0 ]]; then
          break
        fi
      fi
    fi
  done
  echo "${VALID_ICONS_PATH[$BEST_INDEX]}"
}

###################
# LOCALIZE SCRIPT #
###################

# Default language: en_US
THIS_COMMAND_REQUIRE_ROOT_PERMISSIONS="This command require root permissions"
WORKING_FOLDER="Working folder"
COMMAND_NOT_EXECUTED="Command not executed."
NEED_COMMAND_TO_EXECUTE="You must specify a command to execute."
EXAMPLE="Example"
MAKE_ME_A_SANDWICH="Make me a sandwich"

# Import current language. If it fails, en_US will be used
case "`echo ${LANG} | cut -f1 -d ' ' | cut -f1 -d '.'`" in
  "it_IT")
    THIS_COMMAND_REQUIRE_ROOT_PERMISSIONS="Questo comando richiede i permessi di root"
    WORKING_FOLDER="Cartella di lavoro"
    COMMAND_NOT_EXECUTED="Comando non eseguito."
    NEED_COMMAND_TO_EXECUTE="Devi specificare un comando da eseguire."
    EXAMPLE="Esempio"
    MAKE_ME_A_SANDWICH="Fammi un panino"
    ;;
esac

##########
# SCRIPT #
##########

if [[ "`cat /proc/${PPID}/comm`" == "sudo" ]]; then       # If called from sudo...
  COMMAND="$(cat /proc/${PPID}/cmdline | tr '\0' ' ')"    # Detect command line
  #          └────────────┬──────────┘   └────┬────┘
  #                       │                   └───────────→ Translate all zero bytes with spaces
  #                       └───────────────────────────────→ Print comand line from parent process
  zenity --entry \
  --hide-text \
  --window-icon=$(get_icon_path "dialog-password" "22") \
  --title="zen-sudo" \
  --text="${THIS_COMMAND_REQUIRE_ROOT_PERMISSIONS}:\
  \n${COMMAND}\
  \n\n${WORKING_FOLDER}:\
  \n${PWD}\
  \n\n$1"                                                 # Showing request with command and current folder
else                                                      # If called from user...
  if [[ $# > 0 ]]; then                                   # ...and there is at least one argument
    export SUDO_ASKPASS="$(realpath "$0")"                # I am the guy for the GUI
    sudo -A "$@"                                          # Request root permissions
    SUCCESS="$?"                                          # Read result of sudo: 0 should be great
    if [[ "${SUCCESS}" != "0" ]]; then                    # If wrong with sudo...
     zenity --warning\
     --ellipsize\
     --title="zen-sudo"\
     --text="${COMMAND_NOT_EXECUTED}"
    fi
  else                                                    # If there is no arguments, show info message
    zenity --info\
    --ellipsize\
    --window-icon=$(get_icon_path "dialog-password" "22") \
    --title="zen-sudo"\
    --text="${NEED_COMMAND_TO_EXECUTE}\n\n${EXAMPLE}:\n<span font_family=\"monospace\">zen-sudo zenity --ellipsize --info --text=\"${MAKE_ME_A_SANDWICH}\"</span>"
  fi
fi


Va copiato nella cartella /usr/bin e reso eseguibile.
Ora potete avviare qualsiasi programma grafico con zen-sudo!
Questo programma fa parte del progetto zen-de ed è indipendente da qualsiasi ambiente desktop.

#8 09 Gennaio 2022, 20:22:37 Ultima modifica: 09 Gennaio 2022, 20:24:57 di madnessmike
Dato che ultimamente sto spippolando parecchio con file immagine sia ISO che IMG, questo scripto monta qualsiasi file ( :naughty: ) senza root, oppure se è già montato lo smonta, il tutto con un solo parametro semplice.
#!/bin/bash

monta() {
udisksctl loop-setup -f $1
udisksctl mount -b $(losetup -j $1  | cut -d ':' -f 1)
notify-send -i media-floppy "Immagine disco montata" "L'immagine $1 è stata montata."
}

smonta() {
udisksctl unmount -b $1
udisksctl loop-delete -b $1
notify-send -i notification-device-eject "Immagine disco smontata" "L'immagine $2 è stata smontata"
}

if [ -z $1 ]
then
echo "Robo che monta file immagini ISO/IMG senza root, o se già montati li smonta"
echo "Uso: $0 <FileImmagine.img>"
exit 2
fi

if [ ! -f $1 ]
then
echo "Eddai, me lo dai un file?"
exit 1
fi

#Logica: losetup -j <file> restituisce in quale dispositivo /dev/loop* è assegnato il file immagine
#Il resto viene da sé.
DEVICE=$(losetup -j $1  | cut -d ':' -f 1)
if [ -z $DEVICE ]
then
monta $1
else
smonta $DEVICE $1
fi
Il bere trionfa sempre sul male

Me che belli gli script con poche dipendenze! :happy:

Voglio che la AppImage di LibreCAD sia integrata con il sistema: menu, icone e "apri con".
Ho preparato questo script. Siccome funziona, eccolo qui. Se volete il link dello script che non funziona, aprite una pagina 404 a caso.