Jupyter Notebookで!sudoマジックコマンドを実行する方法の備忘録メモ


Jupyter NotebookはPythonの手軽な実行環境として大変便利であり、愛用しています。Python意外の言語が追加出来る上にノートブック上でLinuxコマンド(マジックコマンド)も実行可能です。

実行例

以下の様にlsコマンドやcdコマンドが実行出来ます。

lsコマンド

!ls

cdコマンド

%cd

pipコマンド

pipコマンドもマジックコマンドとして実行可能です。pandasをインストールする場合は以下のコマンドで実行可能です。Jupyter Notebookを使っている時に追加で必要なライブラリを追加する場合以下のコマンドを記載しておけばNotebookの共有時にも安心です。

!pip install pandas

sudoが必要なコマンドも実行

ここから本題です。管理者権限(sudo)で実行が必要なコマンドを実行してみます。ここではaptを実行してみます。Pythonのライブラリでは時々別途OSのパッケージマネージャーでアプリケーションをインストールを求められる物1が有ります。Notebook上で実行出来ればインストール忘れを防げます。

ステップ1: そのまま実行

そのまま試しに!sudo apt updateを実行してみます。

!sudo apt update

以下の様な結果となりました。この状態ではパスワードは入力出来ません。

ステップ2: echoコマンドを使って文字列渡し

echoコマンドを使って文字列としてパスワードを渡してみます。sudoコマンドには-Sオプションを渡します。これでコマンドライン引数としてパスワードを渡せます。(実際は標準入力からパスワードを入力する方式)

!echo "passwd" | sudo -S apt udate

無事動きました。しかし、Notebook共有時に文字列を書き換える必要が有り煩雑になります。加えてこのままではパスワードが丸分かりであり、セキュリティー上好ましく有りません。パスワードが漏れてしまったりしてはパスワードの意味を成しません。。。

パスワードを外部ファイル渡しとする

パスワードをpasswd.txtというファイルに記載し、そのファイルの中身を読み込んで渡す方式に変更します。こうすればパスワードが誤って漏洩する心配も有りません。ファイルの読み込みにはxargsコマンドを用います。コマンドライン引数を作るコマンドです。ここでは-aオプション(--arg-file=)を渡すことでファイルを指定しています。

!xargs -a passwd.txt | sudo apt update

無事実行出来ました。パスワードが漏れる心配が無くなった上にNotebookの共有時にパスワード部分を書き換える必要が無くなり煩雑な作業が無くなりました2。これで安心です。

Reference


  1. MecabやGraphVizはPython版とは別に本体のインストールも必要です。 

  2. passwd.txtに相当するファイルを用意する必要は有りますが。。。