コマンドラインからセキュリティ更新プログラムのみをインストールする方法はありますか?


333

sudo apt-get upgradeセキュリティアップデートだけでなく、すべてのアップデートをインストールします。Update Managerを使用して重要なセキュリティアップデートのみを選択できることは知っていますが、コマンドラインからこれを行う方法はありますか?


2
そうは思いません。dist-upgradeは、システム全体を新しいリリースに移行します。Update Managerに表示されるような、日々の更新について話しています。
マイケルクレンショー

1
ああ、あなたの言っていることがわかりました。ああ、私はapt-get updateを頻繁に実行しています。考えずに入力します。ヘッドアップをありがとう!
マイケルクレンショー

7
「apt-get upgrade」ではなく、「apt-get dist-upgrade」が必要です。「dist-upgrade」は新しいリリース用ではありません(「do-release-upgrade」は別のコマンドです)。「dist-upgrade」を使用すると、新しいパッケージの依存関係の変更を処理します。これは重要です。
キーズクック

3
dist-upgradeは、Update Manager GUIによって実行される通常の操作です。linux-image-generic現在のイメージに応じて、パッケージがあるカーネルなどのパッケージの場合linux-image-3.x.y-zz-generic(たとえば、各バージョンは個別のパッケージ名)、dist-upgrade(依存関係を満たすために新しいパッケージをインストールできる)がこのアップグレードを実行します、アップグレードでは、カーネルパッケージが保留状態として表示されます。
クロニチス

3
apt-get各サーバーにどれだけ目立つようにリストされているかを考えると、これに対する適切な回答がないことに驚く
Karthik T

回答:


308

パッケージ無人アップグレードは、セキュリティ更新プログラムを自動的にインストールする機能を提供します。

これを使用できますが、自動パーツを構成する代わりに、手動で呼び出すことができます。

sudo unattended-upgrade -d --dry-run
sudo unattended-upgrade -d

代わりに静かに実行したい場合:

sudo unattended-upgrade

注:無人アップグレードを呼び出す場合は、「s」を最後から外します。

これは、おそらくパッケージがデフォルトでインストールされていることを前提としています。そうでない場合は、次のようにします。

sudo apt-get install unattended-upgrades

も参照してください/usr/share/doc/unattended-upgrades/README.md


自動実行無効の場合はunattended-upgrade、あなたがおそらく変更する必要がされている/etc/cron.daily/aptが、確かではない、それはそうする「正しい」である
ハイメHablutzelを

サイドノート:Ubuntu 12.04.5 LTSサーバーの場合、unattended-upgradesデフォルトではインストールされません。
ラプター

13
これはコマンドラインから行う-vため、情報メッセージまたは-dデバッグメッセージに使用します。それ以外の場合、ユーティリティは非常に静かになります。その場合、ログを確認する必要があります/var/log/unattended-upgrades--dry-runシミュレートすることもできますが、実際には何もアップグレードしません。詳細情報およびその他のオプションについては、を使用--helpしてヘルプメッセージを取得してください。
ADTC

unattended-upgrades今日はいくつかのことを学びました。ありがとう!
-the0ther

「進行状況を監視するため」、非対話型メッセージをデバッグするだけですよね?
アクエリアスパワー

116

更新を管理する方法に関するいくつかのヒント

これはDebianとUbuntuの両方に適用されますが、Ubuntuのより具体的な手順は次のとおりです。

  • セキュリティアップデートのみを表示する:

    apt-get -s dist-upgrade |grep "^Inst" |grep -i securi 
    

    または

    sudo unattended-upgrade --dry-run -d
    

    または

    /usr/lib/update-notifier/apt-check -p
    
  • アップグレード可能なパッケージをすべて表示

    apt-get -s dist-upgrade | grep "^Inst"
    
  • セキュリティ更新プログラムのみをインストールする

    apt-get -s dist-upgrade | grep "^Inst" | 
        grep -i securi | awk -F " " {'print $2'} | 
        xargs apt-get install
    

ノート:

  • Ubuntuは、$ release-updatesリポジトリから来ているかのようにセキュリティ更新を表示することがあります。Ubuntu開発者は$ release-updatesリポジトリにもセキュリティ更新をプッシュし、可用性を向上させるため、これはそうです。

    その場合は、次の手順を実行してセキュリティ更新プログラムのみを表示できます。

    sudo sh -c 'grep ^deb /etc/apt/sources.list | 
        grep security > /etc/apt/sources.security.only.list'
    

    そして

    apt-get -s dist-upgrade -o Dir::Etc::SourceList=/etc/apt/sources.security.only.list -o Dir::Etc::SourceParts=/dev/null  | 
        grep "^Inst" | awk -F " " {'print $2'}
    
  • パッケージのアップグレード後に再起動する必要があるサービスを確認します。事前にアップグレードするパッケージを把握し、再起動/再起動をスケジュールします。ここでの問題は、サービスを再起動しない限り、セキュリティの脆弱性などを修正する新しいパッケージをインストールする前にメモリに読み込まれた古いバージョンのライブラリ(最も一般的な理由)を使用している可能性があることです。

    checkrestart -v
    

    ただし、checkrestart必ずしも再起動する必要のないプロセスがリストされる場合があることに注意してください。たとえば、PostgreSQLサービスは既に削除されたxlogファイルへのメモリ参照を保持している場合がありますが、これはサービスを再起動する有効な理由ではありません。

    したがって、標準のユーティリティを使用してこれを確認する別のより信頼性の高い方法は、https: //locallost.net/?p = 233から恥知らずに盗んだ次の小さなbashスクリプトです

    アクティブなメモリにそれらのコピーを保持することにより、システム上で実行中のプロセスがまだ削除されたライブラリを使用しているかどうかをチェックします。

    ps xh -o pid |
    while read PROCID; do
           grep 'so.* (deleted)$' /proc/$PROCID/maps 2> /dev/null
           if [ $? -eq 0 ]; then
                   CMDLINE=$(sed -e 's/\x00/ /g' < /proc/$PROCID/cmdline)
                   echo -e "\tPID $PROCID $CMDLINE\n"
           fi
    done
    

1
私は今この投稿にのみ気づきます。非常に正確です。ありがとう(+1)
Danduk82

「checkrestart」はどこから来たのですか?Ubuntu Trustyで見つけることができません。あなたの指示に合うように見える「needrestart」を見つけましたか?
ベンXO

debian-goodiesパッケージ:packages.debian.org/wheezy/debian-goodiesにあります。再起動も必要です。次のコマンドを実行すると、Xenialで両方を見つけることができます。$ apt-cache search checkrestart
ILIV

sudoでも「E:ロックファイル/ var / lib / dpkg / lockを開けませんでした-開く(13:許可が拒否されました)」というメッセージが表示されます。これは、提供された更新またはコマンドのいずれかに固有のものですか?
ネイサンホーンビー

ほとんどの場合、dpkgの不正/異常終了が原因で、ロックファイルがクリアされていません。たとえば、パッケージのインストールが正常に完了しない(フルディスクなど)まで、通常は発生しません。おそらく、他のapt-getおよびdpkgコマンドを実行できませんか?
ILIV

46

/etc/apt/preferences次のものに置き換えます。

Package: *
Pin: release a=lucid-security
Pin-Priority: 500

Package: *
Pin: release o=Ubuntu
Pin-Priority: 50

これで、apt-get upgradeすべてのセキュリティ更新プログラムのみがアップグレードされます。

なぜ(そしてどのように)これが機能するのか:設定ファイルはUbuntuディストリビューションのすべてのパッケージを優先度50に固定します。これにより、既にインストールされているパッケージよりも望ましくなくなります。セキュリティリポジトリから生成されたファイルには、デフォルト(500)の優先度が与えられているため、インストールが考慮されます。つまり、現在インストールされているパッケージよりも望ましいと考えられるパッケージのみがセキュリティ更新プログラムです。ピン留めの詳細については、apt_preferencesのマンページを参照してください

あなたは一時的に更新のための特定の分布を促進することができる--target-releaseと連携オプションapt-getaptitude、彼らはアップグレードの対象になるように、あなたが特定のリリースを固定できるようになります(少なくとも)。

これをスクリプトのみに使用し、システムのデフォルトにしたくない場合は、ルールを他の場所に配置し、代わりにこれを使用できます。

apt-get -o Dir::Etc::Preferences=/path/to/preferences_file upgrade

これにより、aptはデフォルト以外の場所から設定ファイルを探します。

例として与えられた設定ファイルは、サードパーティのリポジトリには適用されません。それらを固定したい場合apt-cache policy、固定に必要なキーを簡単に決定するために使用できます。


徹底的な回答に時間を割いていただきありがとうございます。私それがどのように機能するかを理解していると思います。しかし、/ etc / apt / preferencesファイルを作成してapt-get upgradeを実行すると、セキュリティアップデートだけでなく、すべてのパッケージがアップグレードされます。リストのアップグレードの前後はまったく同じです。ただし、/ etc / apt / preferencesを使用する場合、ソースからビルドしてdpkgで「手動」でインストールしたLeafpadをアップグレードする必要はありません。私には非常に奇妙ですが、あなたにとって何か意味があるかもしれません。
マイケルクレンショー

1
apt-cache policyコマンドで何が起こっているかを確認できます。セキュリティ修正が適用されていないパッケージの1つを選択して実行しapt-cache policy packagenameます。これにより、さまざまなバージョンの優先順位がリストされます。さまざまな行とさまざまな優先順位が表示されます。優先度50の行がない場合、固定は何らかの理由で問題のパッケージに影響しません。
Ressu

1
私は過去にこの答えに従った。今日、この回答により、68個のセキュリティ更新パッケージがサーバーにインストールされておらず、潜在的なインストール候補として表示されないことがわかりました。これは良い答えではありません!
シェード14

12

Ubuntu 14.04 LTSでは次のことが確認されています。

unattended-upgradeパッケージを使用します。

ファイルを見てください/etc/apt/apt.conf.d/50unattended-upgrades。上部に次のセクションがあるはずです。

// Automatically upgrade packages from these (origin:archive) pairs
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
//  "${distro_id}:${distro_codename}-updates";
//  "${distro_id}:${distro_codename}-proposed";
//  "${distro_id}:${distro_codename}-backports";
};

デフォルトでセキュリティパッケージの無人アップグレードのみを許可するように設定されていることに注意してください。

次の/etc/apt/apt.conf.d/10periodicようなファイルを変更します。

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

これにより、1日1回、自動無人セキュリティアップグレードが実行されます。

次に、手動で実行しますsudo unattended-upgrade

何もせずにドライランとしてテストするには:sudo unattended-upgrade --dry-run

ソース:https : //help.ubuntu.com/14.04/serverguide/automatic-updates.html


これを月単位のスケジュールにする方法はありますか?
mike.b93

1
@ mike.b93、私は設定APT::Periodic::Unattended-Upgrade "30";がこれを行うと信じています-30日ごと。
vcardillo

5

かなりいですが、セキュリティリポジトリ以外のすべてのリポジトリを無効にしてから実行できます。

sudo apt-get update && sudo apt-get upgrade

私はそれをテストしていませんが、理論的にはセキュリティリポジトリで更新を見つけて適用するだけです...


ええ、それは可能性です。調べます。私はBASHが得意ではありませんが、それを実行するスクリプトを作成しようとする場合があります。
マイケルクレンショー

OK、Ubuntuセキュリティリポジトリ以外をすべて無効にして、実行しましたsudo apt-get update && sudo apt-get upgrade(アップグレードが完了する前にキャンセルしました)。次に、すべてのリポジトリを再度有効にし、実行しsudo apt-get updatee、Update Managerを開きました。セキュリティ更新プログラムとしてマークされたパッケージは、apt-get upgrade見つかったものとまったく同じではありませんでしたが、非常に近く、私にとっては十分に近いものでした。Update Managerがそれをどのように実行し、コマンドラインから同じことを行う方法を正確に知っていればいいのですが、これは実行できます。ありがとう!
マイケルクレンショー

3
  • apt-get update:リポジトリ内のエントリを読み取る-既存のリストによる。新機能を確認する必要がありました。
  • apt-get upgrade:カーネルモジュールなしのインストール済みパッケージのすべての更新。リリース更新なし。
  • apt-get dist-upgrade:インストールされたパッケージのすべてのアップデートとカーネルモジュール。リリース更新なし。
  • apt-getパラメータ付き-s:テストのみ、変更なし。

0

Debianでは、このコマンドを使用してセキュリティ更新のみを行います。

apt-get install -y --only-upgrade $( apt-get --just-print upgrade | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq )

0

apt-getまたはaptitudeのいずれにもオプションが見つかりませんが、SuperUser について同じ質問がありました。唯一の応答は次のとおりです。

Check and adjust /etc/apt/apt.conf.d/50unattended-upgrade. 
Did you replace 'karmic' with the code name of your Ubuntu?

しかし、それが機能したかどうかについては返信しません。


2
そのwikiページで説明されている方法は、aptitudeの--target-release引数を<release> -securityに設定することに依存しているようです。その質問のOPのように、その方法はセキュリティアップグレードだけでなく、すべてのアップグレードをインストールします。apt-getと適性のmanページを読むと、私は--target-リリース引数がさえ、私はそれだけではよく分からないが、ただセキュリティアップグレードに限定することを意図しているとは思わないですため。
マイケルクレンショー

0

これをいくつかの異なる方法で実現するスクリプトを次に示します。

#!/usr/bin/env bash
set -e

# List upgradable packages
apt-get update
apt list --upgradable 2>/dev/null
# List security upgrades
test "$(apt-get upgrade -s -y)" && (apt-get upgrade -s -y)
# List upgradable apt packages then upgrade
apt-get update && apt-get upgrade -y  -V | grep '=>' | awk '{print$1}' && test "$(apt-get upgrade -y)"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.