/etc/hosts에서 대화 상자의 특정 행 범위까지 cat

/etc/hosts에서 대화 상자의 특정 행 범위까지 cat

예를 들어, 나는 /etc/hosts에 있는 모든 이더넷 스위치를 나열하고 대화 상자에 표시하는 것을 좋아합니다. 그런 다음 목록에서 선택한 스위치를 연결하고 싶습니다.

목록은 특정 주석 줄 사이에 있어야 합니다. 예를 들면 다음과 같습니다.

/etc/호스트:

... 
# ETHERNET SWITCHES
192.168.0.2 SW1
192.168.0.3 SW2
192.168.0.4 SW3
# END SWITCHES
...

$HOST 변수를 나열된 스위치 이름과 연결하여 /etc/hosts의 IP로 ssh를 연결하려면 어떻게 해야 합니까? 가능합니까?

대화 스크립트:

#!/bin/bash
DIALOG_CANCEL=1
DIALOG_ESC=255
HEIGHT=0
WIDTH=0
HOST=`cat /scripts/dialog.out`
IP=`grep '$HOST' /etc/hosts | awk '{print $1}'`

display_result() {
dialog --title "$1" \
--no-collapse \
--msgbox "$result" 0 0
}
while true; do
 exec 3>&1
 selection=$(dialog \
--backtitle "" \
--title "MENU" \
--clear \
--cancel-label "EXIT" \
--menu "SELECT OPTION:" $HEIGHT $WIDTH 6 \
"1" "SW1" \
"2" "SW2" \
"3" "SW3" \
2>&1>/scripts/dialog.out 1>&3)
exit_status=$?
exec 3>&-
case $exit_status in
$DIALOG_CANCEL)
  clear
  exit
  ;;
$DIALOG_ESC)
  clear
  echo "Program aborted." >&2
  exit 1
  ;;
esac
case $selection in
0 )
  clear
  echo "Program terminated."
  ;;
1 )
  ssh admin@$IP
  ;;
 esac
done

답변1

스크립트를 작성할 --menudialog, 메뉴의 첫 번째 열은 다음과 같습니다.상표, 표시 여부를 선택할 수 있습니다. 메뉴가 결정되면 dialog이러한 레이블이 출력에 기록됩니다(일반적으로 표준 오류이지만 이 --stdout옵션이 도움이 됩니다).

IP 주소를 레이블로 설정하면 실행에서 직접 주소를 가져올 수 있습니다 dialog.

내부에수동, 이 선택적 기능은 다음과 같이 설명됩니다.

   --no-items
          Some  widgets  (checklist, inputmenu, radiolist, menu) display a
          list with two columns (a "tag" and "item", i.e., "description").
          This  option  tells  dialog  to  read shorter rows, omitting the
          "item" part of the list.  This is occasionally useful, e.g.,  if
          the tags provide enough information.

          See  also --no-tags.  If both options are given, this one is ig-
          nored.

그리고

   --no-tags
          Some  widgets  (checklist, inputmenu, radiolist, menu) display a
          list with two columns (a "tag" and "description").  The  tag  is
          useful  for scripting, but may not help the user.  The --no-tags
          option (from Xdialog) may be used to suppress the column of tags
          from  the  display.  Unlike the --no-items option, this does not
          affect the data which is read from the script.

          Xdialog does not  display  the  tag  column  for  the  analogous
          buildlist and treeview widgets; dialog does the same.

          Normally  dialog  allows  you  to quickly move to entries on the
          displayed list, by matching a  single  character  to  the  first
          character  of the tag.  When the --no-tags option is given, dia-
          log matches against the first character of the description.   In
          either case, the matchable character is highlighted.

/etc/hosts다음과 같은 다양한 방법으로 라인을 선택할 수 있습니다 sed.

sed -e '1,/# ETHERNET SWITCHES/d' -e '/# END SWITCHES/,9999d' /etc/hosts

dialogand 에 넣어서 $(명령줄로 리디렉션 할 수 있습니다 ).

단축키 1, 2, 3을 SW1, SW2, SW3과 결합하여설명하다--no-tags옵션을 사용하면 연결된 IP 주소와 설명을 유지할 수 있습니다.

여러분이 염두에 두고 있는 예는 다음과 같을 수 있습니다.

#!/bin/bash
INPUT=/etc/hosts
let i=0 # define counting variable
W=() # define working array
while read -r addr line; do # process file by file
  let i=$i+1
  W+=($addr "$i $line")
done < <( sed -e '1,/# ETHERNET SWITCHES/d' -e '/# END SWITCHES/,9999d' $INPUT )
FILE=$(dialog --stdout --no-tags --title "List of Switches in /etc/hosts file" --menu "Chose one" 24 80 17 "${W[@]}" ) # show dialog and store output
clear
if [ $? -eq 0 ]; then # Exit with OK
  ssh $FILE
fi

관련 정보