web-dev-qa-db-ja.com

/ etc / hostsからダイアログボックスまでのcat固有の行範囲

たとえば、/ etc/hostsからのすべてのイーサネットスイッチを一覧表示して、ダイアログボックス内に表示するのが好きです。その後、リストから選択したスイッチを接続したいと思います。

リストは、次のような特定のコメント行の間にリストする必要があります。

/ etc/hosts:

... 
# 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
Mac

--menudialog でスクリプト化する場合、メニューの最初の列はタグです。 、表示するかどうかを選択できます。メニューに問題がなければ、dialogはそれらのタグを出力に書き込みます(通常は標準エラーですが、--stdoutオプションが役立ちます)。

IPアドレスをタグにすると、dialogの実行から直接アドレスを取得できます。

manual では、このオプション機能について次のように説明しています。

   --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.

sedを使用するなど、さまざまな方法で/etc/hostsから行を選択できます。

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

$()に配置することで、コマンドラインからdialogにリダイレクトできます。

descriptionでショートカット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
0
Thomas Dickey