端子入力操作

端子入力操作

実行前に端末入力を操作する方法はありますか?例:

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変数を変更する必要があります。

たとえば、

  1. ラッパーのパスを作成します。

    mkdir $HOME/wrapper
    
  2. プレフィックスPATHパッケージパス(例:inside $HOME/.bashrc):

    export PATH="/home/myuser/wrapper:$PATH`
    
  3. スクリプト例$HOME/wrapper/ls:

    #!/bin/bash
    echo "sudo ls $*"
    

これで実行は次のようになります。

stackoverflow: ls /home
sudo ls /home

セキュリティ上の理由から、他の人がラッパースクリプトを変更できないため、sudoハッカースクリプトを権限で実行しないでください。このようにPATH変数を変更しない理由はいくつかあります。

システム全体でこれを行うと(/etc/profilePATHを変更してラッパーを内部に配置/usr/wrapper)、次のようになります。非常に誰もそこに自分のファイルを置くことができないことを覚えておくことが重要です!

関連情報