web-dev-qa-db-ja.com

SSHセッションからログアウトすると、許可拒否エラーが発生するのはなぜですか?

大学のサーバーでいくつかのテストを実行する必要があります。オフィスのデスクトップからサーバーにsshアクセスできます。週末にいくつかのテストを実行するサーバーでpythonスクリプトを起動したいと思います。

オフィスのデスクトップは週末の間スタンバイ状態になるため、SSHセッションが終了した場合でも、サーバー上でプロセスが引き続き実行されることが不可欠です。

次のような質問で説明されているように、Nohupscreentmuxについて知っています。

私は今何をしていますか:

  • ssh username@server
  • tmux
  • python3 run_my_tests.py->このスクリプトは、それ自体がいくつかのJavaプロセスを起動する他のスクリプトのsubprocess.check_outputの束を実行します。
  • テストは正常に実行されます。
  • Ctrl + B、Dを使用して、セッションを切り離します。
  • tmux attachを実行すると、まだ正常に実行されているtmuxセッションを再取得しますが、エラーはまったくありません。私はこれを数分間チェックし続け、テストは正常に実行されました。
  • Sshセッションを閉じます

この後、SSH経由でサーバーにログインすると、doは実行中のtmuxセッションに再接続できますただし私が見るものは次のようなものです:

Traceback (most recent call last):
  File "run_my_examples.py", line 70, in <module>
  File "run_my_examples.py", line 62, in run_cmd_aggr
  File "run_my_examples.py", line 41, in run_cmd
  File "/usr/lib64/python3.4/subprocess.py", line 537, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/lib64/python3.4/subprocess.py", line 858, in __init__
    restore_signals, start_new_session)
  File "/usr/lib64/python3.4/subprocess.py", line 1456, in _execute_child
    raise child_exception_type(errno_num, err_msg)
PermissionError: [Errno 13] Permission denied

つまり実行中のテストを生成していたプロセスSSHセッションの終了直後は、他のサブプロセスを完全に生成できませんでした。関係するすべてのファイルのアクセス許可をchmodしましたが、何も変更されていません。

サーバーはログイン/許可にKerberosを使用していると思います。サーバーはScientificLinux7.2です。

Sshセッションからログオフすると、新しいプロセスを生成する権限が削除される可能性はありますか?何かできることはありますか?私はseveralテストを起動する必要があります。テストにどれくらいの時間やスペースがかかるかはわかりません...


  • systemdのバージョンは219です
  • ファイルシステムはAFSであり、fs listacl <name>を使用しています。スクリプトで使用されるディレクトリ/ファイルに対するアクセス許可があることを確認できます。
5
Bakuriu

おかげで Mark Plotnick 問題を特定して修正することができました。

問題は、サーバーが使用する AFSファイルシステム と、認証を処理するKerberosの間の相互作用です。同じ問題が SOに関するこの質問 でも取り上げられました。

基本的に何が起こっているのかというと、サーバーにSSHで接続すると、Kerberosがセッションに認証トークンを与えます。このトークンは、AFSファイルシステムへのアクセスにも使用されます。 SSHセッションを閉じると、このトークンは破棄され、実行中のプロセスは、AFS上のファイルにアクセスしようとすると、アクセス許可拒否エラーの取得を開始します。

これを修正する方法は、screen/tmux内で新しいウィンドウを開始し、次のコマンドを起動することです。

kinit && aklog

その後、screen/tmuxからデタッチして、sshセッションを安全に閉じます。

上記のコマンドは、新しいKerberosトークンを作成し、それらをscreen/tmuxセッションに関連付けます。このようにして、ssh接続が閉じられると、最初のトークンは取り消されますが、サブプロセスは作成したトークンを使用するようになります。許可拒否エラーは発生しません。


要約する:

  • ssh username@server
  • tmux
  • 実行を継続するために必要なプロセスを起動します
  • で新しいウィンドウを作成します Ctrl+B, C
  • kinit && aklog
  • とのセッションから切り離す Ctrl+B, D
  • Sshセッションを閉じる
7
Bakuriu

サーバーでscreen ssh $USER@$HOSTNAMEを試してください。

kinit && aklogソリューションは私にとってはうまくいきませんでしたが、この "sshception"ソリューションを見つけました。画面内で、同じマシンにsshを実行し、そのsshセッションでプログラムを実行します。画面が許可を失った場合でも、内部のsshセッションは開いたままで認証されます。

0

このようなエラーは、おそらくファイルシステムのアクセス許可に関連しています。サーバー側のsyslogイベントを確認できますか?

たぶんあなたはあなたの環境にログインしたままでいる必要があるでしょう ここ を見てくださいLinuxファイルのパーミッションと問題についてもっと知るために、それは役立つかもしれません。

0
Tim Connor