PythonのCLI。 サーバーでユーザーを起動します

私は職業ごとにシステム管理者です。 さまざまなクライアントのリモートサーバーをサポートしています。 多くの場合、クライアントからサーバーへのシェルアクセスを許可する要求を聞きます。 一方では、リクエストは十分に根拠があります:サーバーは私のものではなく、クライアントは、ささいなことで私を引っ張らないようにアクセスする必要があります(たとえば、ディスクスペースがなくなったかどうか、またはすべてのプロセスが実行されているかどうかを確認するため)。 一方、クライアントは多くの場合unixの経験がほとんどないため、クライアントが知らないうちにディスクから何かを消去したり、ファイアウォールルールを削除してアクセスをブロックした後に修正できる保証はありません。 多くの場合、顧客自身がこれを理解していますが、他の方法を見ることなくアクセスを提供することを主張しています。



クライアントに切り捨てられたシェルを与え、sudoを使用して「危険な」コマンドの実行を制御できるように思われます。 ただし、セキュリティの観点から、すべてが正常に管理されていても、すべての問題が解決されるわけではありません。 クライアントは、コマンドラインでの作業の基本を学び、さまざまな質問に答え、成功しない理由と理由を理解する必要があります。 サポートに費やす時間が大幅に増加します。



解決策を見つけようとして、PythonのCmdモジュールの説明に出会いました。 このモジュールを使用すると、最小限のコストで必要な一連のコマンドを使用して、コマンドラインインターフェイスの外観を作成できます。



必要に応じてコマンドで補完できる小さなスクリプトフレームワークから始めましょう。 彼がいる。 25行のみ。 ネタバレの下に隠れる必要さえありません。

#!/usr/bin/env python # -*- coding: utf-8 -*- import cmd class Cli(cmd.Cmd): def __init__(self): cmd.Cmd.__init__(self) self.prompt = "> " self.intro = " \n   'help'" self.doc_header ="  (      'help __')" def do_hello(self, args): """hello -  'hello world'  """ print "hello world" def default(self, line): print " " if __name__ == "__main__": cli = Cli() try: cli.cmdloop() except KeyboardInterrupt: print " ..."
      
      







ファイルをcli.pyとして保存して実行します。 スクリプトは元気に私たちを迎え、コマンドプロンプトを発行します。 彼の作品の例を次に示します。

 $ ./cli.py      'help' > help   (      'help __') =========================================================================== hello help > help hello hello -  'hello world'   > hello hello world >  ...
      
      





コードに戻ります。 CmdからCliクラスを継承し、グリーティングと初期ヘルプをネイティブ言語で表示するためのいくつかのプロパティを再定義しました。 また、2つのメソッド-defaultとdo_helloも追加しました。 デフォルトの方法は、ユーザーが入力したコマンドが存在しない場合のコマンドラインの動作を決定します。 do_helloメソッドの詳細を説明します。



do_helloメソッドは、cliの唯一のコマンド(デフォルトで利用可能なヘルプを除く)を記述しています-こんにちは。 cmdモジュールは、 do_commandなどのメソッドがcliのコマンドコマンドに変換されるという規則に従います。 メソッドの本文の最初の行である三重引用符で囲まれたコメントは、このコマンドのヘルプに変換されます。 args引数は、ユーザー引数の文字列をメソッドに渡します。 たとえば、ユーザーがコンソールで「hello everyone」と入力した場合、 args変数には「everyone」という文字列が含まれます。 この場合、コマンドライン引数を無視します。



デフォルトでは、自動補完(タブによる)とコマンド履歴(上矢印)が利用可能です。 組み込みのhelpコマンドも使用できます(「?」とも呼ばれます)。これは、豊富な魔法の助けを借りて、スクリプトコード内のコメントをコマンドのヘルプに変換します。



このスクリプトフレームワークを使用して、 do_cmdなどの必要なメソッドをコードに追加することにより、コマンドラインインターフェイスの機能を拡張できます。 たとえば、ペイロードを伝送しないhelloコマンドを削除し、システムを監視するための便利なコマンドをいくつか追加します。

見せる
 #!/usr/bin/env python # -*- coding: utf-8 -*- import cmd import os class Cli(cmd.Cmd): def __init__(self): cmd.Cmd.__init__(self) self.prompt = "> " self.intro = " \n   'help'" self.doc_header ="  (      'help __')" def do_show_cpu(self, args): """show_cpu -   """ os.system("sar 2") def do_show_mem(self, args): """show_mem -  RAM""" os.system("free") def do_show_disk(self, args): """show_disk -    """ os.system("df -h") def do_show_net(self, args): """show_net -  """ os.system("/sbin/ifconfig") os.system("/sbin/route -n") def do_show_log(self, args): """show_log -  """ os.system("sudo tail -f /var/log/messages") def default(self, line): print " " def emptyline(self): pass if __name__ == "__main__": cli = Cli() try: cli.cmdloop() except KeyboardInterrupt: print " ..."
      
      







新しく作ったシェルの準備ができました。 システムのすべてのユーザーが読むことができる場所に移動します。 たとえば、 / usr / local / bin /にあります。 おそらく、スクリプトへのパスを/ etc / shellsに記述する必要があります。



シェルでユーザーを追加し、試してください:

 # adduser user --shell /usr/local/bin/cli.py ... root@laptop:~# su - user      'help' > ?   (      'help __') =========================================================================== help show_cpu show_disk show_log show_mem show_net > show_cpu Linux 3.5.0-17-generic (laptop) 04/03/2013 _x86_64_ (4 CPU) 02:38:03 PM CPU %user %nice %system %iowait %steal %idle 02:38:05 PM all 0.63 0.00 0.25 0.13 0.00 98.99 02:38:07 PM all 1.00 0.00 0.25 0.25 0.00 98.50 > show_mem total used free shared buffers cached Mem: 3911236 2123408 1787828 0 124156 994752 -/+ buffers/cache: 1004500 2906736 Swap: 4393980 0 4393980 >
      
      






All Articles