Bash について
Cisco NX-OS CLI に加えて、スイッチは Bourne-Again SHell(Bash)へのアクセスをサポートします。Bash は、ユーザーが入力したコマンドまたはシェル スクリプトから読み取られたコマンドを解釈します。Bash を使用すると、デバイス上の基盤となる Linux システムにアクセスしてシステムを管理できます。
この製品のドキュメントセットは、偏向のない言語を使用するように配慮されています。このドキュメントセットでの偏向のない言語とは、年齢、障害、性別、人種的アイデンティティ、民族的アイデンティティ、性的指向、社会経済的地位、およびインターセクショナリティに基づく差別を意味しない言語として定義されています。製品ソフトウェアのユーザインターフェイスにハードコードされている言語、RFP のドキュメントに基づいて使用されている言語、または参照されているサードパーティ製品で使用されている言語によりドキュメントに例外が存在する場合があります。シスコのインクルーシブ ランゲージの取り組みの詳細は、こちらをご覧ください。
このドキュメントは、米国シスコ発行ドキュメントの参考和訳です。リンク情報につきましては、日本語版掲載時点で、英語版にアップデートがあり、リンク先のページが移動/変更されている場合がありますことをご了承ください。あくまでも参考和訳となりますので、正式な内容については米国サイトのドキュメントを参照ください。
Cisco NX-OS CLI に加えて、スイッチは Bourne-Again SHell(Bash)へのアクセスをサポートします。Bash は、ユーザーが入力したコマンドまたはシェル スクリプトから読み取られたコマンドを解釈します。Bash を使用すると、デバイス上の基盤となる Linux システムにアクセスしてシステムを管理できます。
Bash シェルには、次の注意事項と制約事項があります。
/isan フォルダにあるバイナリは、 run bash コマンドから入力されたシェルとは異なる設定の環境で実行するためのものです。Bash シェルからこれらのバイナリを使用しないことをお勧めします。その環境内での動作は予測できないからです。
Cisco NX-OS では、Cisco NX-OS dev-ops ロールまたは Cisco NX-OS network-admin ロールに関連付けられたユーザ アカウントから Bash にアクセスできます。
次の例は、dev-ops ロールと network-admin ロールの権限を示しています。
switch# show role name dev-ops
Role: dev-ops
Description: Predefined system role for devops access. This role
cannot be modified.
Vlan policy: permit (default)
Interface policy: permit (default)
Vrf policy: permit (default)
-------------------------------------------------------------------
Rule Perm Type Scope Entity
-------------------------------------------------------------------
4 permit command conf t ; username *
3 permit command bcm module *
2 permit command run bash *
1 permit command python *
switch# show role name network-admin
Role: network-admin
Description: Predefined network admin role has access to all commands
on the switch
-------------------------------------------------------------------
Rule Perm Type Scope Entity
-------------------------------------------------------------------
1 permit read-write
switch#
feature bash-shell コマンドを実行すると、Bash が有効になります。
この run bash コマンドは Bash を読み込み、ユーザーのホーム ディレクトリから開始します。
次の例は、Bash シェル機能を有効にする方法と、Bash を実行する方法を示しています。
switch# configure terminal
switch(config)# feature bash-shell
switch# run?
run Execute/run program
run-script Run shell scripts
switch# run bash?
bash Linux-bash
switch# run bash
bash-4.2$ whoami
admin
bash-4.2$ pwd
/bootflash/home/admin
bash-4.2$
![]() (注) |
run bash command コマンドで Bash コマンドを実行することもできます。 たとえば、run bash コマンド を使用して whoami を実行することもできます。
ユーザー shelltype を構成して Bash を実行することもできます。
このコマンドにより、Bash シェルを直接実行できるようになります。 |
管理者ユーザーの特権は、ルート アクセスの特権をエスカレーションできます。
以下は、権限をエスカレーションするためのガイドラインです:
特権を root にエスカレーションできるのは管理者ユーザーのみです。
権限をエスカレーションする前に、Bash を有効にする必要があります。
root へのエスカレーションはパスワードで保護されています。
非管理インターフェイスを介した root ユーザー名を使用したスイッチへの SSH では、root ユーザーの Linux Bash シェル タイプ アクセスがデフォルトになります。NX-OS シェル アクセスに戻るために vsh を入力します。
NX-OS ネットワーク管理者ユーザーは、次の場合に root にエスカレーションして、構成コマンドを NX-OS VSH に渡す必要があります。
NX-OS ユーザはシェルタイプの Bash を使用しており、シェルタイプの Bash を使用してスイッチにログインしています。
Bash でスイッチにログインした NX-OS ユーザーは、引き続きスイッチで Bash を使用します。
sudo su 'vsh -c "<configuration commands>"' または sudo bash -c 'vsh -c "<configuration commands>"' を実行します。
ssh -l MyUser 1.2.3.4
-bash-4.2$ sudo vsh -c "configure terminal ; interface eth1/2 ; shutdown ; sleep 2 ; show interface eth1/2 brief"
--------------------------------------------------------------------------------
Ethernet VLAN Type Mode Status Reason Speed Port
Interface Ch #
--------------------------------------------------------------------------------
Eth1/2 -- eth routed down Administratively down auto(D) --
以下の例は、デフォルトの shelltype が Bash であるネットワーク管理者ユーザー MyUser が、NX-OS に入り、NX-OS で Bash を実行する方法を示しています。
ssh -l MyUser 1.2.3.4
-bash-4.2$ vsh -h
Cisco NX-OS Software
Copyright (c) 2002-2016, Cisco Systems, Inc. All rights reserved.
Nexus 3600 software ("Nexus 3600 Software") and related documentation,
files or other reference materials ("Documentation") are
the proprietary property and confidential information of Cisco
Systems, Inc. ("Cisco") and are protected, without limitation,
pursuant to United States and International copyright and trademark
laws in the applicable jurisdiction which provide civil and criminal
penalties for copying or distribution without Cisco's authorization.
Any use or disclosure, in whole or in part, of the Nexus 3600 Software
or Documentation to any third party for any purposes is expressly
prohibited except as otherwise authorized by Cisco in writing.
The copyrights to certain works contained herein are owned by other
third parties and are used and distributed under license. Some parts
of this software may be covered under the GNU Public License or the
GNU Lesser General Public License. A copy of each such license is
available at
http://www.gnu.org/licenses/gpl.html and
http://www.gnu.org/licenses/lgpl.html
***************************************************************************
* Nexus 3600 is strictly limited to use for evaluation, demonstration *
* and NX-OS education. Any use or disclosure, in whole or in part of *
* the Nexus 3600 Software or Documentation to any third party for any *
* purposes is expressly prohibited except as otherwise authorized by *
* Cisco in writing. *
***************************************************************************
switch# run bash
bash-4.2$ vsh -c "configure terminal ; interface eth1/2 ; shutdown ; sleep 2 ; show interface eth1/2 brief"
--------------------------------------------------------------------------------
Ethernet VLAN Type Mode Status Reason Speed Port
Interface Ch #
--------------------------------------------------------------------------------
Eth1/2 -- eth routed down Administratively down auto(D) --
次の例は、特権を root にエスカレーションする方法と、エスカレーションを確認する方法を表示しています。
switch# run bash
bash-4.2$ sudo su root
bash-4.2# whoami
root
bash-4.2# exit
exit
このセクションには、Bash コマンドと出力の例が含まれています。
次の例は、システム統計情報の表示方法を示しています:
switch# run bash
bash-4.2$ cat /proc/meminfo
<snip>
MemTotal: 16402560 kB
MemFree: 14098136 kB
Buffers: 11492 kB
Cached: 1287880 kB
SwapCached: 0 kB
Active: 1109448 kB
Inactive: 717036 kB
Active(anon): 817856 kB
Inactive(anon): 702880 kB
Active(file): 291592 kB
Inactive(file): 14156 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 32 kB
Writeback: 0 kB
AnonPages: 527088 kB
Mapped: 97832 kB
<\snip>
次に、run bashコマンド を使用して Bash から ps を実行する例を示します:
switch# run bash ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 528 poll_s ? 00:00:03 init
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 80 0 - 0 run_ks ? 00:00:56 ksoftirqd/0
1 S 0 6 2 0 -40 - - 0 cpu_st ? 00:00:00 migration/0
1 S 0 7 2 0 -40 - - 0 watchd ? 00:00:00 watchdog/0
1 S 0 8 2 0 -40 - - 0 cpu_st ? 00:00:00 migration/1
1 S 0 9 2 0 80 0 - 0 worker ? 00:00:00 kworker/1:0
1 S 0 10 2 0 80 0 - 0 run_ks ? 00:00:00 ksoftirqd/1
次の例は、Python をロードし、Python オブジェクトを使用してスイッチを構成する方法を示しています。
switch# run bash
bash-4.2$ python
Python 2.7.5 (default, Oct 8 2013, 23:59:43)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from cisco import *
>>> from cisco.vrf import *
>>> from cisco.interface import *
>>> vrfobj=VRF('myvrf')
>>> vrfobj.get_name()
'myvrf'
>>> vrfobj.add_interface('Ethernet1/3')
True
>>> intf=Interface('Ethernet1/3')
>>> print intf.config()
!Command: show running-config interface Ethernet1/3
!Time: Mon Nov 4 13:17:56 2013
version 6.1(2)I2(1)
interface Ethernet1/3
vrf member myvrf
>>>
| コマンドまたはアクション | 目的 | |
|---|---|---|
|
ステップ 1 |
sudo dnf installed | grep platform |
スイッチにインストールされている NX-OS 機能 RPM のリストを表示します。 |
|
ステップ 2 |
dnf list available |
使用可能な RPM のリストを表示します。 |
|
ステップ 3 |
sudo dnf -y install rpm |
使用可能な RPM をインストールします。 |
次に、bfd RPM をインストールする例を示します。
bash-4.2$ dnf list installed | grep n9000
base-files.n9000 3.0.14-r74.2 installed
bfd.lib32_n9000 1.0.0-r0 installed
core.lib32_n9000 1.0.0-r0 installed
eigrp.lib32_n9000 1.0.0-r0 installed
eth.lib32_n9000 1.0.0-r0 installed
isis.lib32_n9000 1.0.0-r0 installed
lacp.lib32_n9000 1.0.0-r0 installed
linecard.lib32_n9000 1.0.0-r0 installed
lldp.lib32_n9000 1.0.0-r0 installed
ntp.lib32_n9000 1.0.0-r0 installed
nxos-ssh.lib32_n9000 1.0.0-r0 installed
ospf.lib32_n9000 1.0.0-r0 installed
perf-cisco.n9000_gdb 3.12-r0 installed
platform.lib32_n9000 1.0.0-r0 installed
shadow-securetty.n9000_gdb 4.1.4.3-r1 installed
snmp.lib32_n9000 1.0.0-r0 installed
svi.lib32_n9000 1.0.0-r0 installed
sysvinit-inittab.n9000_gdb 2.88dsf-r14 installed
tacacs.lib32_n9000 1.0.0-r0 installed
task-nxos-base.n9000_gdb 1.0-r0 installed
tor.lib32_n9000 1.0.0-r0 installed
vtp.lib32_n9000 1.0.0-r0 installed
bash-4.2$ dnf list available
bgp.lib32_n9000 1.0.0-r0
bash-4.2$ sudo dnf -y install bfd
![]() (注) |
起動時のスイッチのリロード時に、永続的な RPM の代わりに コマンドを使用します。rpm dnf それ以外の場合、RPM は最初にインストールされたのではなく、リポジトリ名またはファイル名を使用してインストールされるか、または表示されます。dnf bash install cli |
dnf リポジトリに RPM の上位バージョンが存在する必要があります。
| コマンドまたはアクション | 目的 |
|---|---|
|
sudo dnf -y upgrade rpm |
インストールされている RPM をアップグレードします。 |
次に、bfd RPM のアップグレードの例を示します。
bash-4.2$ sudo dnf -y upgrade bfd
| コマンドまたはアクション | 目的 |
|---|---|
|
sudo dnf -y downgrade rpm |
いずれかの dnf リポジトリに下位バージョンの RPM がある場合に、RPM をダウングレードします。 |
次に、bfd RPM をダウングレードする例を示します。
bash-4.2$ sudo dnf -y downgrade bfd
![]() (注) |
SNMP RPM および NTP RPM は保護されており、消去できません。 これらの RPM をアップグレードまたはダウングレードできます。アップグレードまたはダウングレードを有効にするには、システムのリロードが必要です。 保護された RPM のリストについては、/etc/yum/protected.d/protected_pkgs.conf /etc/dnf/protected.d/protected_pkgs.conf を参照してください。 |
| コマンドまたはアクション | 目的 |
|---|---|
|
sudo dnf -y erase rpm |
RPM を消去します。 |
次の例は、bfd RPM を消去する方法を示しています:
bash-4.2$ sudo dnf -y erase bfd
アプリケーションには、/etc/init.d/application_name にインストールされる起動 bash スクリプトが必要です。この起動 bash スクリプトは、次の一般的なフォーマットにする必要があります(このフォーマットの詳細については、http://linux.die.net/man/8/chkconfigを参照してください)。
#!/bin/bash
#
# <application_name> Short description of your application
#
# chkconfig: 2345 15 85
# description: Short description of your application
#
### BEGIN INIT INFO
# Provides: <application_name>
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Description: Short description of your application
### END INIT INFO
# See how we were called.
case "$1" in
start)
# Put your startup commands here
# Set RETVAL to 0 for success, non-0 for failure
;;
stop)
# Put your stop commands here
# Set RETVAL to 0 for success, non-0 for failure
;;
status)
# Put your status commands here
# Set RETVAL to 0 for success, non-0 for failure
;;
restart|force-reload|reload)
# Put your restart commands here
# Set RETVAL to 0 for success, non-0 for failure
;;
*)
echo $"Usage: $prog {start|stop|status|restart|force-reload}"
RETVAL=2
esac
exit $RETVAL
|
ステップ 1 |
上記で作成したアプリケーション起動 bash スクリプトを /etc/init.d/application_name にインストールします。 |
|
ステップ 2 |
/etc/init.d/application_name start でアプリケーションを開始します |
|
ステップ 3 |
chkconfig --add application_name を入力します |
|
ステップ 4 |
chkconfig --level 3 application_name on を入力します 実行レベル 3 は、標準のマルチユーザ実行レベルであり、スイッチが通常実行されるレベルです。 |
|
ステップ 5 |
-- application_name を実行して、アプリケーションがレベル 3 で実行されるようにスケジュールされていることを確認し、レベル 3 が on に設定されていることを確認します。chkconfiglist |
|
ステップ 6 |
アプリケーションが /etc/rc3.d にリストされていることを確認します。「S」の後に数字が続き、アプリケーション名(この例では tcollector)が続き、../init.d/application_name に bash 起動スクリプトへのリンクが表示されます。 |
lrwxrwxrwx 1 root root 20 Sep 25 22:56 /etc/rc3.d/S15tcollector ->../init.d/tcollector
bash-4.2#
Cisco NX-OS リリース 9.3(1) 以降では、ファイル コピー操作には、use-kstack オプションを使用して別のネットワーク スタックを介して実行するオプションがあります。use-kstack を通じてファイルをコピーすると、コピー時間が短縮されます。このオプションは、スイッチから複数のホップにあるリモート サーバーからファイルをコピーする場合に役立ちます。use-kstack オプションは、 scp や sftp. などの標準ファイル コピー機能を通じてスイッチに、またはスイッチからファイルをコピー処理します。
![]() (注) |
スイッチが FIPS モード機能を実行している場合、use-kstack オプションは機能しません。スイッチで FIPS モードが有効になっている場合、コピー操作は引き続き成功しますが、デフォルトのコピー方法が使用されます。 |
use-kstack を介してコピーするには、NX-OS copy コマンドの最後に引数を追加します。たとえば:
switch-1# copy scp://test@10.1.1.1/image.bin . vrf management use-kstack
switch-1#
switch-1# copy scp://test@10.1.1.1/image.bin bootflash:// vrf management use-kstack
switch-1#
switch-1# copy scp://test@10.1.1.1/image.bin . use-kstack
switch-1#
switch-1# copy scp://test@10.1.1.1/image.bin bootflash:// vrf default use-kstack
switch-1#use-kstack オプションは、すべての NX-OS copy コマンドとファイル システムでサポートされています。オプションは OpenSSL(セキュア コピー)認定済みです。
次の例は、ネイティブ Bash シェルのアプリケーションを示しています:
bash-4.2# cat /etc/init.d/hello.sh
#!/bin/bash
PIDFILE=/tmp/hello.pid
OUTPUTFILE=/tmp/hello
echo $$ > $PIDFILE
rm -f $OUTPUTFILE
while true
do
echo $(date) >> $OUTPUTFILE
echo 'Hello World' >> $OUTPUTFILE
sleep 10
done
bash-4.2#
bash-4.2#
bash-4.2# cat /etc/init.d/hello
#!/bin/bash
#
# hello Trivial "hello world" example Third Party App
#
# chkconfig: 2345 15 85
# description: Trivial example Third Party App
#
### BEGIN INIT INFO
# Provides: hello
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Description: Trivial example Third Party App
### END INIT INFO
PIDFILE=/tmp/hello.pid
# See how we were called.
case "$1" in
start)
/etc/init.d/hello.sh &
RETVAL=$?
;;
stop)
kill -9 `cat $PIDFILE`
RETVAL=$?
;;
status)
ps -p `cat $PIDFILE`
RETVAL=$?
;;
restart|force-reload|reload)
kill -9 `cat $PIDFILE`
/etc/init.d/hello.sh &
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|status|restart|force-reload}"
RETVAL=2
esac
exit $RETVAL
bash-4.2#
bash-4.2# chkconfig --add hello
bash-4.2# chkconfig --level 3 hello on
bash-4.2# chkconfig --list hello
hello 0:off 1:off 2:on 3:on 4:on 5:on 6:off
bash-4.2# ls -al /etc/rc3.d/*hello*
lrwxrwxrwx 1 root root 15 Sep 27 18:00 /etc/rc3.d/S15hello -> ../init.d/hello
bash-4.2#
bash-4.2# reboot
リロード後
bash-4.2# ps -ef | grep hello
root 8790 1 0 18:03 ? 00:00:00 /bin/bash /etc/init.d/hello.sh
root 8973 8775 0 18:04 ttyS0 00:00:00 grep hello
bash-4.2#
bash-4.2# ls -al /tmp/hello*
-rw-rw-rw- 1 root root 205 Sep 27 18:04 /tmp/hello
-rw-rw-rw- 1 root root 5 Sep 27 18:03 /tmp/hello.pid
bash-4.2# cat /tmp/hello.pid
8790
bash-4.2# cat /tmp/hello
Sun Sep 27 18:03:49 UTC 2015
Hello World
Sun Sep 27 18:03:59 UTC 2015
Hello World
Sun Sep 27 18:04:09 UTC 2015
Hello World
Sun Sep 27 18:04:19 UTC 2015
Hello World
Sun Sep 27 18:04:29 UTC 2015
Hello World
Sun Sep 27 18:04:39 UTC 2015
Hello World
bash-4.2#