Сценарий оболочки для scp rpm на удаленный сервер и его установки. Нужна переменная для передачи имени удаленного хоста - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь написать своего рода сценарий меню, который после выполнения приведёт к следующему:

  1. Спросите, каким пользователем / паролем вы выполняете сценарий как.
  2. Задайте вопрос ip удаленного сервера, на который вы хотите отправить файлы scp.
  3. Спросите каталог, в котором файлы хранятся локально.
  4. Спросите каталог, куда должны быть переданы все файлы.
  5. Скопируйте все файлы.

Первое препятствие, которое у меня есть, это получение пароля, хранящегося в виде переменной в меню. Я думаю, что sshpass будет хорош для этого. Я хотел бы настроить меню следующим образом:

title="Select example"
prompt="Pick an option:"
options=("A" "B" "C")

echo "$title"
PS3="$prompt "
select opt in "${options[@]}" "Quit"; do 

    case "$REPLY" in

    1 ) echo "You picked $opt which is option $REPLY";;
    2 ) echo "You picked $opt which is option $REPLY";;
    3 ) echo "You picked $opt which is option $REPLY";;

    $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;;
    *) echo "Invalid option. Try another one.";continue;;

    esac

done

Но меню будет запрашивать у вас имя пользователя, локальный каталог файлов, ip удаленного сервера, каталог удаленного сервера и затем запускать созданную им команду scp.

Примерно так:

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>

Но я немного озадачен тем, как собрать все это вместе, чтобы меню собирало необходимую информацию и затем выполняло собранную вход, так что он просто создает команду scp для запуска.

Может кто-нибудь предложить какой-либо опыт с этим, чтобы помочь мне в создании сценария меню?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Вам не нужно меню, просто запрашивайте каждый вход последовательно.

read -p "Username:" username
read -s -p "Password:" password
read -p "Server IP:" ip
read -p "Local directory:" local
read -p "Remote directory" remote
sshpass -p "$password" scp "/$local/final.txt" "$username@$ip:/root/$remote/"
1 голос
/ 30 января 2020

Если вам все еще нужно меню, вот оно. Я немного изменил ваш скрипт, чтобы он создавал / печатал команду scp при вводе значений одно за другим.

#!/bin/bash

title="Select example"
prompt="Pick an option:"
declare -A options # turn options to an associative array
options[1]='change user name'
options[2]='change user password'
options[3]='change remote host address'
options[4]='change path to source files'
options[5]='change destination path on remote server'

PS3="$prompt "
menu () { # wrap all this to a function to restart it after edition of an element
    echo "$title"
    select opt in "${options[@]}" "Quit"; do
        case "$REPLY" in
            1 ) read -p  "${options[1]}: " user;;
            2 ) read -sp "${options[2]}: " pass;; # read password with option -s to disable output
            3 ) read -p  "${options[3]}: " addr;;
            4 ) read -p  "${options[4]}: " from;;
            5 ) read -p  "${options[5]}: " dest;;

            $(( ${#options[@]}+1 )) ) echo "Goodbye!" ; exit;;
            *) echo "Invalid option. Try another one.";;
        esac
        clear # clear screen to remove inputs
        printf "Creating scp command:\n"
        # we don't want to show password, print *** if password set and 'password not set' if not
        [[ $pass ]] && pass2='***' || pass2='[password not set]'
        # text in [] will be printed if var is empty or not set, it's usefull to add default values to vars ${var:-default_value}
        printf "sshpass -p $pass2 scp -r ${from:-[source not set]}/* ${user:-[user not set]}@${addr:-[host not set]}:${dest:-[destination not set]}/\n\n"
        menu
    done
}

clear # clear screen
menu  # and start menu function

И здесь У меня есть скрипт с похожим (но более богатым) функциональность, пожалуйста, посмотрите.

...