実行前に端末入力を操作する方法はありますか?例:
apt-get update
端末に入力してください。今sudo apt-get update
実行前に変更したいと思います。
私が試したこと:
操作された入力を使用して入力されたコマンドを実行するスクリプトを実行する可能性を検討しましたが、他のプログラムの実行中にスクリプトを実行する方法を見つけることができませんでした。
すべての回答に感謝します。私はLinux Mint Serenaを使用しています。
言う:
コマンドが呼び出されるたびにバックグラウンドで実行され、パターンと一致することを確認するスクリプトなどが必要です。それ以外の場合は入力を実行し、そうであればコマンドを操作して実行します。 ->これが私の例でtoapt-get update
を使う理由ですsudo apt-get update
。私が理解できる唯一のことは、スクリプトが実行される前にコマンドを取得する方法です。
考えられる目的:
特定のファイル/ディレクトリにアクセスしようとしたときにパスワードプロンプトを入力してください
ショートカットの作成(
cd _1
に変更cd ~/Desktop
)
答え1
では、zsh
いくつかのテスターを追加して次のことができます。
validate_apt-get_update() {
local match MATCH MBEGIN MEND mbegin mend
if [[ $BUFFER =~ '^(\s*)(apt-get\s+update.*)' ]]; then
LBUFFER="$match[1]sudo " RBUFFER=$match[2]
zle -M 'WARNING: sudo has been added before apt-get update'
return 1
fi
}
accept-line() {
validate_apt-get_update && zle .accept-line
}
zle -N accept-line
を挿入し、sudo
その後にカーソルを置き、警告メッセージを表示し、apt-get
入力した最初の2つの単語があり、更新された場合は行を受け入れず、実際に望むものであることを確認する機会を提供します。
ここでは、シェルコマンドラインの簡単な解析を行っています。次のように入力すると機能しません。
'apt-get' update
"$(echo apt-get)" update
something else; apt-get update...
次のことができるので良いかもしれません。
\apt-get update
エイリアスをバイパスしたい場合と同様に、そのチェックをバイパスしたい場合。
あなたcd _1
の場合は、cd ~/Desktop
次のことができます。
set -o cdable_vars
_1=~/Desktop
個人的に、私はシェルが私の背中でこのようなことをするという考えがあまり好きではありません(特に他の人が少なくとも期待しないこと)。
答え2
まあ、全く新しいものです。 PS4を使って答えを読んでください。すべてのコマンドを傍受する方法
今テストした場合:
bash: PS4='$(echo $(date) $(history 1) >> /tmp/trace.txt) TRACE: '
bash: set -x
bash: date
TRACE: date
Fr 28. Jul 14:13:24 CEST 2017
上記の回答で述べたように、PS4...実行されるすべてのコマンドに対して評価されます...。したがって、ラッパーを介してコマンドを渡し、実行を確認するためにそれを置き換えると傍受できます。どのあなたの命令。
答え3
シェルによるとalias
(ウィキペディア概念的な詳細があります)。
Bashで永続的な別名を作成するには、それを別名に追加して.bashrc
次のように編集できます。gedit ~/.bashrc
次に、下部に次の行を追加します。
alias apt-get-update='sudo apt-get update'
複数の単語でエイリアスを作成することは、ダッシュやアンダースコアで連結しないと機能しません。
答え4
ログイン専用の場合は、システムコマンドの前に実行されるラッパースクリプトを作成できます。システムコマンドの前にラッパーを実行するには、PATH変数を変更する必要があります。
たとえば、
ラッパーのパスを作成します。
mkdir $HOME/wrapper
プレフィックスPATHパッケージパス(例:inside
$HOME/.bashrc
):export PATH="/home/myuser/wrapper:$PATH`
スクリプト例
$HOME/wrapper/ls
:#!/bin/bash echo "sudo ls $*"
これで実行は次のようになります。
stackoverflow: ls /home
sudo ls /home
セキュリティ上の理由から、他の人がラッパースクリプトを変更できないため、sudo
ハッカースクリプトを権限で実行しないでください。このようにPATH変数を変更しない理由はいくつかあります。
システム全体でこれを行うと(/etc/profile
PATHを変更してラッパーを内部に配置/usr/wrapper
)、次のようになります。非常に誰もそこに自分のファイルを置くことができないことを覚えておくことが重要です!