Как запустить удаленный скрипт с помощью sudo через ssh без ввода пароля

Введение

Вопрос изменен.

  • Мой первый вариант (oneliner )не соответствует новой спецификации, но сохраняет самый новый каталог среди каталогов, достаточно старых для удаления (старше 14 дней ).

  • Я сделал второй вариант, (сценарий оболочки ), который использует

    @ секунд с 1 января 1970 года, 00 :00 по Гринвичу, с дробной частью.

    и вычитание секунд, соответствующих 14 дням, чтобы получить отметку времени для «предела -в -секунд» в seclimв отсортированном списке каталогов.

1. Oneliner

Предыдущие ответы чистые и приятные, но они не сохраняют новейший каталог follower. Следующая командная строка сделает это (и может управлять именами с пробелами, но имена с новыми строками создают проблемы ),

find. -type d -name "follower*" -printf "%T+ %p\n"|sort|head -n -1 | cut -d ' ' -f 2- | sed -e 's/^/"/' -e 's/$/"/' | xargs echo rm -r

проверено на этой структуре каталогов,

$ find -printf "%T+ %p\n"|sort
2019-01-10+13:11:40.6279621810./follower1
2019-01-10+13:11:40.6279621810./follower1/2/3
2019-01-10+13:11:40.6279621810./follower1/2/dirnam with spaces
2019-01-10+13:11:40.6279621810./follower1/2/name with spaces
2019-01-10+13:11:56.5968732640./follower1/2/file
2019-01-10+13:13:18.3975675510./follower2
2019-01-10+13:13:19.4016254340./follower3
2019-01-10+13:13:20.4056833250./follower4
2019-01-10+13:13:21.4097412230./follower5
2019-01-10+13:13:22.4137991260./follower6
2019-01-10+13:13:23.4138568040./follower7
2019-01-10+13:13:24.4219149500./follower8
2019-01-10+13:13:25.4259728780./follower9
2019-01-10+13:15:34.4094596830./leader1
2019-01-10+13:15:36.8336011960.
2019-01-10+13:15:36.8336011960./leader2
2019-01-10+13:25:03.0751878450./follower1/2

вот так,

$ find. -type d -name "follower*" -printf "%T+ %p\n"|sort|head -n -1 | cut -d ' ' -f 2- | sed -e 's/^/"/' -e 's/$/"/' | xargs echo rm -r
rm -r./follower1./follower2./follower3./follower4./follower5./follower6./follower7./follower8

Таким образом, follower9исключен, потому что это самая новая followerдиректория (директорий с именами, которые не начинаются с follower(leader1, leader2и 2в игре нет ).

Теперь мы добавляем критерий времени, -mtime +14и делаем еще один "пробный прогон", чтобы проверить, что он работает должным образом, когда мы изменили каталог на настоящий followerкаталог,

find. -type d -name "follower*" -mtime +14 -printf "%T+ %p\n"|sort|head -n -1 | cut -d ' ' -f 2- | sed -e 's/^/"/' -e 's/$/"/' | xargs echo rm -r

Наконец, мы удаляем echoи получаем командную строку, которая может делать то, что мы хотим,

find. -type d -name "follower*" -mtime +14 -printf "%T+ %p\n"|sort|head -n -1 | cut -d ' ' -f 2- | sed -e 's/^/"/' -e 's/$/"/' | xargs rm -r

  • findв текущем каталоге, каталоги с именами, начинающимися с follower, которые не изменялись 14 дней назад.
  • После печати и сортировкиhead -n -1будет исключен самый новый followerкаталог .
  • Отметки времени обрезаются, а в начале и в конце каждого имени каталога добавляются двойные кавычки.
  • Наконец, результат передается через xargsв качестве параметров в rm -rдля удаления каталогов, которые мы хотим удалить.

2. Шеллскрипт

Я сделал второй вариант, (сценарий оболочки ), который использует

@      seconds since Jan. 1, 1970, 00:00 GMT, with fractional part.

Он также имеет две опции:

  • -nпробный прогон
  • -vподробный

  • Я изменил сценарий оболочки в соответствии с тем, что хочет OP:введите шаблон в качестве параметра в одинарных кавычках, например. 'последователь *'.

  • Я предлагаю назвать сценарий оболочки prune-dirs, потому что теперь он более общий (, а не только prune-followersдля обрезки каталоговfollower*).

Рекомендуется запустить сценарий оболочки с обоими параметрами в первый раз, чтобы «увидеть», что вы будете делать, и, когда все будет выглядеть правильно, удалить -n, чтобы сценарий оболочки удалил каталоги, которые достаточно стары для удалить. Итак, давайте назовем его prune-dirsи сделаем исполняемым.

#!/bin/bash

# date        sign     comment
# 2019-01-11  sudodus  version 1.1
# 2019-01-11  sudodus  enter the pattern as a parameter
# 2019-01-11  sudodus  add usage
# 2019-01-14  sudodus  version 1.2
# 2019-01-14  sudodus  check if any parameter to the command to be performed

# Usage

usage () {
 echo "Remove directories found via the pattern (older than 'datint')

 Usage:    $0 [options] <pattern>
Examples: $0 'follower*'
          $0 -v -n 'follower*'  # 'verbose' and 'dry run'
The 'single quotes' around the pattern are important to avoid that the shell expands
the wild card (for example the star, '*') before it reaches the shellscript"
 exit
}

# Manage options and parameters

verbose=false
dryrun=false
for i in in "$@"
do
 if [ "$1" == "-v" ]
 then
  verbose=true
  shift
 elif [ "$1" == "-n" ]
 then
  dryrun=true
  shift
 fi
done
if [ $# -eq 1 ]
then
 pattern="$1"
else
 usage
fi

# Command to be performed on the selected directories

cmd () {
 echo rm -r "$@"
}

# Pattern to search for and limit between directories to remove and keep

#pattern='follower*'
datint=14  # days

tmpdir=$(mktemp -d)
tmpfil1="$tmpdir"/fil1
tmpfil2="$tmpdir"/fil2

secint=$((60*60*24*datint))
seclim=$(date '+%s')
seclim=$((seclim - secint))
printf "%s limit-in-seconds\n" $seclim > "$tmpfil1"

if $verbose
then
 echo "----------------- excluding newest match:"
 find. -type d -name "$pattern" -printf "%T@ %p\n" | sort |tail -n1 | cut -d ' ' -f 2- | sed -e 's/^/"/' -e 's/$/"/'
fi

# exclude the newest match with 'head -n -1'

find. -type d -name "$pattern" -printf "%T@ %p\n" | sort |head -n -1 >> "$tmpfil1"

# put 'limit-in-seconds' in the correct place in the sorted list and remove the timestamps

sort "$tmpfil1" | cut -d ' ' -f 2- | sed -e 's/^/"/' -e 's/$/"/' > "$tmpfil2"

if $verbose
then
 echo "----------------- listing matches with 'limit-in-seconds' in the sorted list:"
 cat "$tmpfil2"
 echo "-----------------"
fi

# create 'remove task' for the directories older than 'limit-in-seconds'

params=
while read filnam
do
 if [ "${filnam/limit-in-seconds}" != "$filnam" ]
 then
  break
 else
  params="$params $filnam"
 fi
done < "$tmpfil2"
cmd $params > "$tmpfil1"
cat  "$tmpfil1"

if ! $dryrun && ! test -z "$params"
then
 bash "$tmpfil1"
fi
rm -r $tmpdir
  • Изменить текущий каталог на каталог с followerподкаталогами
  • создать файлprune-dirs
  • сделать его исполняемым
  • и запустить с двумя вариантами-v -n

    cd directory-with-subdirectories-to-be-pruned/
    nano prune-dirs  # copy and paste into the editor and save the file
    chmod +x prune-dirs
    ./prune-dirs -v -n
    

Тест

Я тестировал prune-dirsв каталоге со следующими подкаталогами -,как видно изfind

$ find. -type d -printf "%T+ %p\n"|sort
2018-12-01+02:03:04.0000000000./follower1234
2018-12-02+03:04:05.0000000000./follower3456
2018-12-03+04:05:06.0000000000./follower4567
2018-12-04+05:06:07.0000000000./leader8765
2018-12-05+06:07:08.0000000000./bystander6789
2018-12-06+07:08:09.0000000000./follower with spaces old
2019-01-09+10:11:12.0000000000./follower7890
2019-01-10+11:12:13.0000000000./follower8901
2019-01-10+13:15:34.4094596830./leader1
2019-01-10+13:15:36.8336011960./leader2
2019-01-10+14:08:36.2606738580./2
2019-01-10+14:08:36.2606738580./2/follower with spaces
2019-01-10+17:33:01.7615641290./follower with spaces new
2019-01-10+19:47:19.6519169270.

Использование

$./prune-dirs
Remove directories found via the pattern (older than 'datint')

 Usage:   ./prune-dirs [options] <pattern>
Examples:./prune-dirs 'follower*'
         ./prune-dirs -v -n 'follower*'  # 'verbose' and 'dry run'
The 'single quotes' around the pattern are important to avoid that the shell expands
the wild card (for example the star, '*') before it reaches the shellscript

Запуск с-v -n(пробным прогоном с подробной информацией)

$./prune-dirs -v -n 'follower*'
----------------- excluding newest match:
"./follower with spaces new"
----------------- listing matches with 'limit-in-seconds' in the sorted list:
"./follower1234"
"./follower3456"
"./follower4567"
"./follower with spaces old"
"limit-in-seconds"
"./follower7890"
"./follower8901"
"./2/follower with spaces"
-----------------
rm -r "./follower1234" "./follower3456" "./follower4567" "./follower with spaces old"

Подробная пробная версия с более общим шаблоном

$ LANG=C./prune-dirs -v -n '*er*'
----------------- excluding newest match:
"./follower with spaces new"
----------------- listing matches with 'limit-in-seconds' in the sorted list:
"./follower1234"
"./follower3456"
"./follower4567"
"./leader8765"
"./bystander6789"
"./follower with spaces old"
"limit-in-seconds"
"./follower7890"
"./follower8901"
"./leader1"
"./leader2"
"./2/follower with spaces"
-----------------
rm -r "./follower1234" "./follower3456" "./follower4567" "./leader8765" "./bystander6789" "./follower with spaces old"

Запуск без каких-либо параметров (реальный случай удаления каталогов)

$./prune-dirs 'follower*'
rm -r "./follower1234" "./follower3456" "./follower4567" "./follower with spaces old"

Выполнить с -v«попытка еще раз»

$ LANG=C./prune-dirs -v 'follower*'
----------------- excluding newest match:
"./follower with spaces new"
----------------- listing matches with 'limit-in-seconds' in the sorted list:
"limit-in-seconds"
"./follower7890"
"./follower8901"
"./2/follower with spaces"
-----------------
rm -r

В сценарии оболочки нет каталога «выше» «предел -в -секунд», и нет файлов, перечисленных для командной строки rm -r, поэтому работа уже выполнена (, что является правильным результат ). Но если вы снова запустите шеллскрипт через несколько дней, какой-то новый каталог может быть найден «выше» «предела -в -секунд» и будет удален.

0
05.02.2021, 15:10
2 ответа

Либо ваш adminпользователь на 192.168.2.250 должен иметь возможность sudoправильному пользователю, например ssh sudo id, либо вы можете настроить -ssh -для пользователя, которому разрешено корневой доступ к машине, поэтому ssh root@192.168.2.250.

Если вы один в своей домашней сети, оба должны быть в порядке; в корпоративной среде следует учитывать последствия для безопасности.

0
18.03.2021, 22:32

вы можете разрешить root-доступ только с помеченной аутентификацией открытого ключа ssh :в конфигурации /etc/ssh/sshd _, установите PermitRootLogin forced-command-onlyКоманда Force -— это команда, которую вы помечаете открытым ключом в ключах /root/.ssh/authorized _, таких как command="script_you_have_strictly_controlled" id-rsa <public key here>Таким образом, у вас есть контролируемое повышение прав для выполнения только авторизованных и предопределенных задач

.
0
18.03.2021, 22:32

Теги

Похожие вопросы