예를 들어, 나는 /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
스크립트를 작성할 --menu
때dialog
, 메뉴의 첫 번째 열은 다음과 같습니다.상표, 표시 여부를 선택할 수 있습니다. 메뉴가 결정되면 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
dialog
and 에 넣어서 $(
명령줄로 리디렉션 할 수 있습니다 )
.
단축키 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