私は次のようなことをします。
- コマンドはsshを介してbashスクリプトのルートとしてサーバー上でリモートで実行する必要があり、コマンド出力は変数から取得する必要があります。
- SSH 経由のルートログインが無効になっています。
- サーバーでsudoが無効になっているため、suを使用する必要があります。
- 編集:bashでできるだけ自動化したいので、パスワードは〜しなければならないコマンド内部に保存
数日間インターネット検索をしてみましたが、解決策が見つからないようです。
ここで提案された解決策:SSHでサーバーに接続し、ユーザーを切り替えてディレクトリを変更します。
ssh -t username@hostname "sudo su - otheruser -c \"cd /path/to/directory && command\""
サーバーでsudoが無効になっているため、機能しません。
誰にも解決策はありますか?
答え1
SSHを介して(無許可のユーザーとして)ログインし、パラメータなしでコマンドを実行してsu
rootに変更します。これを行うには、ルートパスワードが必要です。次に、実行したいコマンドを実行します。
編集する:1行でこれを行うには、次のコマンドを使用できます。
ssh username@hostname "su -c \"code_here\""
それでも機能しない場合は、passwd
rootとして実行してrootパスワードを有効にしていることを確認してください。新しいルートパスワードを入力するように求められます。
追加:root以外のユーザーとしてコマンドを実行するには(ターゲットユーザーのパスワードが必要です):
ssh username@hostname "su - username_of_target -c \"code_here\""
答え2
少し話題から外れたかもしれませんが、Pythonとパラミコ基準寸法:
#!/usr/bin/python2
import time
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('127.0.0.1', port=22, username='user', password='pass')
stdin, stdout, stderr = ssh.exec_command('su')
time.sleep(0.1) # some enviroment maybe need this.
stdin.write('root_password_goes_here\n')
[ add extra code here to execute a command ]
stdin.flush()
print (stdout.readlines())
ssh.close()
スクリプトにパスワードを保存することは通常、セキュリティの観点から悪い考えであることに注意してください。スクリプトに適切な権限を設定していることを確認してください(例:chmod 740)。
答え3
ルートパスワードをスクリプトに入力する代わりに、実行可能ファイルを使用してセキュリティ上の問題を軽減できますsetuid
。
setuid
実行可能ファイルは、どのユーザーが実行しているかに関係なく、root として実行されます。
これの最大の利点は、誰かがラップトップを盗んだ場合はsmartctl -a /dev/sda
rootとして実行できますが、そうでない場合はユーザー権限のみを持つことができることです。あるいは、後で述べるforceコマンドを使用して公開鍵を設定する場合は、はるかに少なくなります。
smartctl_wrapper.c
次のように、必要なスクリプトまたはプログラムのみを実行する簡単なCプログラムを作成します。
#include <unistd.h>
int main() {
//depending on your use case, you may want
//setuid(0), setgid(0), and/or setegid(0) here
execl("/full/path/to/smartctl","smartctl","-a","/dev/sda",(char*) NULL);
}
にコンパイルしますgcc smartctl_wrapper.c -o smartctl_wrapper
。
次に、それを実行できる必要があるグループとルートに属するように設定します。次のコマンドはrootとして実行する必要があります。
chown root:some_group smartctl_wrapper
次に実行可能にしますsetuid
。また、すべてのユーザーが編集できないようにすることもできます。
chmod 4510 smartctl_wrapper
some_group
これは、root権限を持つすべてのメンバーがパスワードなしで実行できる実行可能ファイルです。
これでsshを使って簡単に実行できます。
ssh [email protected] /path/to/smartctl_wrapper
サーバーが許可している場合は、公開鍵を使用してSSH接続を確立して、パスワードなしの接続を許可できます。また、使用することができます必須注文したがって、このキーはこのスクリプトを実行する以外には役に立ちません。
サーバーがそれを許可しない場合は、SSHパスワードを含むスクリプトを作成できます。この場合は/sbin/nologin
。
あるいは、特定のユースケースでは、コマンドを完全にrootとして実行しない方が合理的ですssh
。たとえば、このコマンドが定期的に実行されるようにスケジュールするために使用できますcron
。次のコマンドを使用してルートのcrontabを編集できます。
su -c crontab -e -u root
そして次の行を追加してください:
5 0 * * sun smartctl -a /dev/sda >> /some/path/to/log/some/non/root/user/can/read
与えられた行は週に一度、日曜日の深夜5分後にコマンドを実行します。以下の指示に従って、必要に応じて調整できます。スケジュールされたタスク(5)。
ssh
その後、それを使用してログを読み取ることができます。
答え4
だから4時間の追加のWebクロールの最後についに成功しました!大きいこれについての洞察を提供した@jeroen-it-nerdboxに感謝します。
これは、smartctl(root 資格情報が必要)、ssh-root 無効化、sudo 無効化サーバーからデータを取得することです。もちろん、これはsuの代わりにsudoにも当てはまります。
以下は、Paramiko実装を使用したPythonの完全な作業コードです。
#!/usr/bin/python2
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('rootserver.domain.com', port=22, username='admin', password='adminpass')
stdin, stdout, stderr = ssh.exec_command('/bin/su root -c "smartctl -a /dev/sda > /tmp/smartctl_output"', get_pty=True)
stdin.write('rootpass\n')
stdin.flush()
print (stdout.readlines())
ssh.close()