クーロン設定での小技集。設定の基本と、ちょっとしたテクニックを紹介

Linux

今回は、ちょっと特殊なクーロン設定を、まとめる形で紹介していきます
実際の業務でクーロンの設定をおこなう際、“あれ?あの設定でどうやるんだっけ?”というときに役立つTIPS集としてまとめます。


何か思いだしたら都度追記していきます。


クーロン設定の基本


まずは設定の基本を紹介します。
クーロン設定は以下の書式になります。

分  時  日  月  曜日 ユーザ名  コマンド

0分から59分までを定義

0時から23時までを定義

1日から31日までを定義

1月から12月までを定義。英字略形も可(jan,feb…dec)

曜日

0から7までを定義。0が日曜。英字略形も可(sun,mon…sat)


各定義について、リスト定義と範囲体後のどちらも可能です。

リスト

1,5,10

指定した値の場合のみ実行

範囲

1-5

指定した値の範囲内であれば実行

共存

1,5,10-15

リストと範囲の混在定義

間隔

1-5/2

「/」の後に間隔値を定義。左記の例だと「1,3,5」


月末に1回だけ動く


“月末に1回だけ動く”といったクーロン設定について紹介します。

結論を先に言いますと、以下の設定でOKです。


59 23 28-31 * * root   /usr/bin/test `date -d tomorrow +\%d` -eq 1 && sh /home/root/sample.sh

これで、”月末に1回だけ動く”というクーロン設定になります。

各設定の詳細について説明してきます。

前半部分が「月末」の定義です。

59 23 28-31 の部分ですね。


毎月、28日、29日、30日、31日の、23時59分にクーロンを動かせる設定になります。
でもこのままだと、月末に1回だけではなく、最大4回動いてしまいます。

なので、次の日が”1日”だったらという条件を追加します。
つまり、3月だと3月31日の次の日が1日(4月1日)だったら月末、
9月だと9月30日の次の日が1日(10月1日)だったら月末、という事ですね。


その計算が、/usr/bin/test `date -d tomorrow +\%d` -eq 1 &&  です。


testコマンドで条件を記述しています。
「date -d tomorrow +\%d」の返り値が1だったら月末と判定します。


この条件を28日から31日に動かすことによって、月末1回動作します。


標準出力をさせない


クーロンで実行したプログラムの実行結果が標準出力されることを防ぐためには、クーロン設定の末尾に標準出力を無しにする記述をおこないます。

55 23 28-31 * * root   /usr/bin/test `date -d tomorrow +\%d` -eq 1 && sh /home/root/sample.sh > /dev/null 2>&1

標準出力をなし(NULL)にします。
これで、標準出力はおこなわれません。



ApacheのログにPOSTで送信された内容をログ出力する方法

apache


Apacheのアクセスログには、デフォルトでGET形式で送信されたきたデータはログ出力されます。
しかし、POST形式で送信されたきたデータはログ出力されません。


実際には、Apacheが受信した時点でのHTTPリクエストにおけるPOSTデータを確認した場合があるかと思います。


というわけで今回は、POST形式で送信されたきたデータをApacheのログに出力する方法を紹介します。


Apacheの設定を追加するだけで、ApacheのログにPOST形式で送信されたきたデータをログ出力できるようになります。


環境情報


  • OS:Windows10
  • Apache:Apache 2.4.41

mod_dumpioモジュールの有効化


POST形式で送信されたきたデータをログ出力するためには、「mod_dumpio」というApacheモジュールを有効にする必要があります。
「<Apacheインストールフォルダ>\conf」下の「httpd.conf」について、「mod_dumpio」を検索し、コメントアウトをはずして有効化します。


LoadModule dumpio_module modules/mod_dumpio.so

このモジュールを有効化することにより、HTTPリクエストの内容がログ出力されるようになります。


ログ出力設定の有効化


POST形式で送信されたきたデータをログ出力するためには、mod_dumpioモジュールの有効化以外に、httpd.confに3つの設定をおこなう必要があります。


  • 「DumpIOInput」ディレクティブの追記
  • 「DumpIOOutput」ディレクティブの追記
  • ログレベルを「dumpio:trace7」にする

「DumpIOInput」ディレクティブを追記します。
これを追記することで、HTTPリクエストの内容がログ出力されるようになります。

DumpIOInput On

「DumpIOOutput」ディレクティブを追記します。
これを追記することで、HTTPレスポンスの内容がログ出力されるようになります。

DumpIOOutput On

ログレベルを「dumpio:trace7」にします。

LogLevel dumpio:trace7

最後にApacheを再起動して、ログ出力の準備完了です。


POSTデータのログ出力


POST形式のリクエストがログ出力されるようになったのですが、具体的には「error.log」にログ出力されます。
以下のような感じです。

mod_dumpio:  dumpio_in (data-HEAP): Referer: http://localhost:81/test/post.html?query=1\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio:  dumpio_in (data-HEAP): 36 bytes
mod_dumpio:  dumpio_in (data-HEAP): Accept-Encoding: gzip, deflate, br\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio:  dumpio_in (data-HEAP): 42 bytes
mod_dumpio:  dumpio_in (data-HEAP): Accept-Language: ja,en-US;q=0.9,en;q=0.8\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio:  dumpio_in (data-HEAP): 2 bytes
mod_dumpio:  dumpio_in (data-HEAP): \r\n
mod_dumpio: dumpio_in [readbytes-blocking] 25 readbytes
mod_dumpio:  dumpio_in (data-HEAP): 25 bytes
mod_dumpio:  dumpio_in (data-HEAP): address=address&name=name



Apache+Tomcatのインストールと連携設定

apache

こんにちは。

さくさくTECHブロガーの「さく」です。


今回は、ApacheとTomcatをインストールし、連携をおこなうまでの方法を紹介します。


ApacheはHTTPサーバで、TomcatはWEBサーバになります。
どちらも単独で動かすことができますが、ちょっとしたWEBアプリケーションでは、連携して環境を構築するパターンが多いです。

その場合、フロント側にApache、バック側にTomcatを設置します。
WEBアプリケーションはTomcat上に乗せた場合、Apacheで受けたHTTPリクエストをTomcatに連携する必要があります。


環境情報


  • OS:Windows10
  • Apache:Apache 2.4.41
  • Tomcat:Tomcat 8.5.51

Apacheのダウンロードとインストール


今回は、Windows(64Bit)の「Apache 2.4.41」をダウンロードします。

Apacheのダウンロードは、以下のサイトから可能です。



Apacheのダウンロード

ZIPファイルを解凍すると、「httpd-2.4.41-win64-VC14」というフォルダが解凍されます。
「httpd-2.4.41-win64-VC14」フォルダ配下の「Apache24」を、Cドライブ直下に格納します。


次のDOSプロンプトを起動し、インストールの準備をおこないます。
DOSプロンプトを管理者権限で起動します。

管理者として実行

ユーザアカウント制御の確認ダイアログが表示されますが、「はい」を押下して先に進みます。

管理者としての実行

DOSプロンプトが開いたら、先ほどダウンロードした「Apache24」配下に存在する「\bin」フォルダに移動します。

コマンドプロンプト

以下コマンドを実行し、インストールを開始します。

httpd.exe -k install

インストールコマンドを実行していますが、実態はサービス化とサービスの起動をおこなっているようです。
なので、サービスの起動に失敗した場合は以下ようなメッセージが表示されます。

c:\Apache24\bin>httpd.exe -k install
Installing the 'Apache2.4' service
The 'Apache2.4' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.
(OS 10013)アクセス許可で禁じられた方法でソケットにアクセスしようとしました。  : AH00072: make_sock: could not bind to address [::]:80
(OS 10013)アクセス許可で禁じられた方法でソケットにアクセスしようとしました。  : AH00072: make_sock: could not bind to address 0.0.0.0:80
AH00451: no listening sockets available, shutting down
AH00015: Unable to open logs

「Errors reported・・・」以降がエラーの内容です。
筆者の場合は上記のようなエラーになりましたが、インストールしようとするマシンによってエラーの内容は異なるかと思います。


今回は、上記エラーの原因を探ります。
エラーメッセージの内容から、Apacheが使用する80ポートが既に使用されているようです。
「netstat -oab」コマンドを実行し、80ポートを使用しているアプリケーションを探します。

c:\Apache24\bin>netstat -oab
アクティブな接続
  プロトコル  ローカル アドレス      外部アドレス           状態            PID
  TCP         0.0.0.0:80             DESKTOP-U7JE3FQ:0      LISTENING       4

PID=4のアプリケーションが80ポートを使用しているようです。
PID=4のアプリケーションを特定します。


「tasklist」コマンドを実行して確認してみます。

c:\Apache24\bin>tasklist
イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0          8 K
System                           4 Services                   0      1,492 K

「System」ってあるけど。。。なに?って感じです。


いろいろググりましたが、特定するのが面倒になってきたので、Apacheのデフォルトポートを変更することにします。
Apacheのデフォルトポートは、「C:\Apache24\conf\httpd.conf」に定義されています。
『Listen』で検索すると80と定義されている箇所があるので、アプリケーションが使用していないポートに変更します。
筆者は81に変更してみました。

# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
#80→81
Listen 81

再度、Apacheを起動してみます。
「コントロールパネル」→「サービス」からApacheを指定し、サービスの開始をおこないます。
状態が「実行中」になったら起動成功になります。

サービスでのApache起動確認

最後にブラウザからアクセスして、Apacheが起動したかを確認します。
「http://localhost:81/」をブラウザのURLバーに入力し、起動確認します。

Apacheの起動確認

WEB画面上に「It works!」が表示されていれば、Apacheがきちんと起動していることになります。


これで、Apacheのインストールと起動確認は完了です。


Tomcatのダウンロードとインストール


今回は、Windows(64Bit)の「Tomcat 8.5.51」をダウンロードします。
バイナリ版をダウンロードします。



Tomcatのダウンロード

ZIPファイルを解凍すると、「apache-tomcat-8.5.51」というフォルダが解凍されます。
そのフォルダをCドライブ直下に格納します。


ここから、Tomcat起動のための準備をおこないます。


最初に「CATALINA_HOME」の設定をおこないます。

「CATALINA_HOME」の設定

次に、tomcatのbin下に「パス」を設定します。

tomcatのパス設定

最後に「JAVA_HOME」です。

「JAVA_HOME」の設定

環境変数の設定は完了したらので、Tomcatを起動してみます。
Apacheのインストール時と同様に、管理者権限でDOSプロンプトをひらきます。
「c:\apache-tomcat-8.5.51\bin」に移動したら、「startup.bat」を実行します。

c:\apache-tomcat-8.5.51\bin>startup.bat

別ウィンドウでログが表示されれば起動成功です。
以下のようなログがウィンドウに表示されます。
以下のログは、Tomcatのログフォルダにも出力されます。

15-Feb-2020 16:59:55.242 情報 [main] org.apache.catalina.core.StandardService.startInternal サービス [Catalina] を起動します
15-Feb-2020 16:59:55.242 情報 [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.51
15-Feb-2020 16:59:55.253 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ [C:\apache-tomcat-8.5.51\webapps\docs] を配備します
15-Feb-2020 16:59:55.583 警告 [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom セッション ID を生成するための SecureRandom インスタンスの作成に [147] ミリ秒かかりました。アルゴリズムは [147] です。
15-Feb-2020 16:59:55.599 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory ディレクトリ [C:\apache-tomcat-8.5.51\webapps\docs] の Web アプリケーションの配置は [346] ms で完了しました。
15-Feb-2020 16:59:55.599 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ [C:\apache-tomcat-8.5.51\webapps\examples] を配備します
15-Feb-2020 16:59:55.898 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory ディレクトリ [C:\apache-tomcat-8.5.51\webapps\examples] の Web アプリケーションの配置は [299] ms で完了しました。
15-Feb-2020 16:59:55.898 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ [C:\apache-tomcat-8.5.51\webapps\host-manager] を配備します
15-Feb-2020 16:59:55.944 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory ディレクトリ [C:\apache-tomcat-8.5.51\webapps\host-manager] の Web アプリケーションの配置は [46] ms で完了しました。
15-Feb-2020 16:59:55.945 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ [C:\apache-tomcat-8.5.51\webapps\manager] を配備します
15-Feb-2020 16:59:55.972 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory ディレクトリ [C:\apache-tomcat-8.5.51\webapps\manager] の Web アプリケーションの配置は [27] ms で完了しました。
15-Feb-2020 16:59:55.972 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ [C:\apache-tomcat-8.5.51\webapps\ROOT] を配備します
15-Feb-2020 16:59:55.995 情報 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory ディレクトリ [C:\apache-tomcat-8.5.51\webapps\ROOT] の Web アプリケーションの配置は [23] ms で完了しました。
15-Feb-2020 16:59:56.000 情報 [main] org.apache.coyote.AbstractProtocol.start プロトコルハンドラー ["http-nio-8080"] を開始しました。
15-Feb-2020 16:59:56.011 情報 [main] org.apache.catalina.startup.Catalina.start Server startup in 797 ms

最後にブラウザからアクセスして、Tomcatが起動したかを確認します。
「http://localhost:8080/」をブラウザのURLバーに入力し、起動確認します。

Tomcatの起動確認

上記のTomcat画面が表示されれば、Tomcatの起動成功です。


ちなみに、起動は「startup.bat」ですが、終了は「shutdown.bat」になります。
「shutdown.bat」を実行すると、Tomcatは停止されます。


ApacheとTomcatのバージョン確認


インストールしたApacheとTomcatのバージョンを確認しておきます。

Apacheのバージョンは、DOSプロンプトで以下のコマンドを実行します。

c:\Apache24\bin>httpd -v
Server version: Apache/2.4.41 (Win64)
Apache Lounge VC14 Server built:   Aug 12 2019 10:48:01

インストールしたApacheのバージョンが「2.4.41」であることがわります。


次にTomcatのバージョンを確認します。
Tomcatのバージョンは、インストールされた「version.bat」を実行します。

C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin>version.bat
Using CATALINA_BASE:   "C:\Program Files\Apache Software Foundation\Tomcat 8.5"
Using CATALINA_HOME:   "C:\Program Files\Apache Software Foundation\Tomcat 8.5"
Using CATALINA_TMPDIR: "C:\Program Files\Apache Software Foundation\Tomcat 8.5\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.8.0_60"
Using CLASSPATH:       "C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\bootstrap.jar;C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\tomcat-juli.jar"
Server version: Apache Tomcat/8.0.41.0
Server built:   Sep 28 2017 10:30:11 UTC
Server number:  8.0.41.0
OS Name:        Windows 10
OS Version:     10.0
Architecture:   amd64
JVM Version:    1.8.0_60-b27
JVM Vendor:     Oracle Corporation

インストールしたTomcatのバージョンが「8.0.41」であることがわります。



ApacheとTomcatの連携設定


最後に、ApacheとTomcatの連携をおこないます。
Apacheでリクエストを受け付け、受け付けたリクエストをTomcatに転送します。


Tomcatに連携するドキュメントルートを準備


Tomcatに新たなドキュメントルートを設けます。
最終的に、ここで作成するドキュメントルートについて、Apacheと連携します。


今回は、Tomcatのドキュメントルートに「test」というフォルダを作成し、HelloWorldを表示するHTMLを準備します。


Tomcatにアクセスし、配置した「helloWorld.html」がブラウザで表示されることを確認します。
ブラウザで「http://localhost:8080/test/helloWorld.html」を入力して確認します。

ドキュメントルートの設定

この時点では、まだApacheとTomcatの接続はおこなわれていません。
8080ポートでアクセスしているので、現時点ではまだTomcat直接アクセスになっています。


8080ポートを停止し、AJPプロトコルでの接続準備


現時点では8080ポートで直接接続が可能な状態ですが、Apache経由での接続に切り替えるため、8080ポートでの直接接続を出来ないようにします。


Tomcatインストールディレクトリの「\conf\server.xml」をひらき、8080ポートでの接続設定をコメントアウトします。

    <!--					
    <Connector port="8080" protocol="HTTP/1.1"					
               connectionTimeout="20000"					
               redirectPort="8443" />					
    -->					

server.xmlの修正が完了したらTomcatを再起動します。

再起動が完了したら、再度、8080ポートへのアクセスをおこない、アクセスできなかったら設定変更は成功です。

server.xmlの設定変更

次に、「AJP/1.3」を使用してApacheとの接続準備をおこないます。
インストール時点でserver.xmlに設定が入っている場合もあれば、設定が入っているがコメントアウトされている場合もあります。
筆者のTomcatインストール時点ではコメントアウトされていたので、Apacheとの接続設定部分についてコメントアウトをはずしておきます。

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector protocol="AJP/1.3"
               address="::1"
               port="8009"
               redirectPort="8443" />

server.xmlの修正が完了したらTomcatを再起動します。
しかし、上記の設定(デフォルト)では、エラーが出てしまい起動に失敗してしまいました。

15-Feb-2020 17:50:18.727 重大 [main] org.apache.catalina.core.StandardService.startInternal Failed to start connector [Connector[AJP/1.3-8009]]		
	org.apache.catalina.LifecycleException: プロトコルハンドラの起動に失敗しました	
		at org.apache.catalina.connector.Connector.startInternal(Connector.java:1057)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.StandardService.startInternal(StandardService.java:440)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:766)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.startup.Catalina.start(Catalina.java:688)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:497)
		at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:343)
		at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474)
	Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.	
		at org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:274)
		at org.apache.catalina.connector.Connector.startInternal(Connector.java:1055)
		... 12 more

どうやら「secretRequired」というオプションの設定が必須のようです。
この設定は、AJPコネクタを信頼できないサイトと接続する際に使用するオプションのようです。
Tomcatのマニュアルに「信頼できるサイトと接続する場合にのみfalseを設定すること」とあるので、今回は「false」を設定します。


    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector protocol="AJP/1.3"
               address="::1"
               port="8009"
               secretRequired="false"
               redirectPort="8443" />

server.xmlの修正が完了したらTomcatを再起動し、エラーが発生せずに起動が完了したら変更完了です。


Apacheの設定


最後にApacheの設定をおこないます。
Apache側でproxy_ajpを使用するようにします。


proxy_ajpを使用するためには、Apacheのproxy_ajpモジュールを使用するようにします。
使用するモジュールは以下の2つです。


  • mod_proxy.so
  • mod_proxy_ajp.so

Apacheのhttpd.conf内をモジュール名で検索し、以下のようにコメントアウトをはずします。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

一応、Apacheを再起動して無事に起動すること(モジュールを使えるようになったこと)を確認します。

Apacheの起動確認

最後に、ApacheにTomcatとの接続設定をおこないます。
以下の設定を追加します。

<Location /test/>					
    ProxyPass ajp://localhost:8009/test/					
</Location>					

この設定を「httpd.conf」に追加すればよいのですが、Apacheの記述ルールに従って記述を追加します。
「httpd-proxy.conf」を作成し、上記の記述を追加し、「httpd.conf」の中に「httpd-proxy.conf」の読み込み設定をおこなえば設定完了です。


Include conf/extra/httpd-proxy.conf

最後にApacheを再起動して無事に起動が完了したら設定完了です。


これで、ApacheとTomcatがAJPを使用して接続されました。
以下のURLをブラウザに入力して、最終確認します。


http://localhost:81/test/helloWorld.html

ApacheとTomcatの接続設定

Apacheのデフォルトポートに設定した「81」を経由して、Tomcat上に格納したHelloWorldを表示するHTMLの表示がおこなわれました。




cpコマンド(コピー)の使い方。覚えておくと便利なオプションも解説。

Linux

前回、lsコマンドの使い方、覚えておくと便利なオプションについて紹介させてもらいました。



今回は、コピーコマンドについて紹介していきます。
コピーコマンドについても、Linuxで作業をおこなう上では必須のコマンドになります。
こちらもまた、使わない人はいないでしょう。


メジャーなオプションからマイナーなオプションまで、いろいろ説明していきます。


頻繁に使うコマンドなのであまり忘れることはないオプションが多いかもしれませんが、参考にしてください。


同名ファイルが存在する場合はバックアップ作成(-b)


コピー先に同名ファイルが存在する場合、バックアップファイルを作成します。
「-b」オプションを使用します。


$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:31 .
drwxr-xr-x 5 xxx yyy 4096 2019-07-28 23:49 ..
-rw-r--r-- 1 xxx yyy    5 2020-01-29 01:31 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:31 src.txt
$ cp -b src.txt dest.txt
$ ls -la
total 20
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:31 .
drwxr-xr-x 5 xxx yyy 4096 2019-07-28 23:49 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:31 dest.txt
-rw-r--r-- 1 xxx yyy    5 2020-01-29 01:31 dest.txt~
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:31 src.txt

上記コマンド結果のようになります。
コピー先に既に「dest.txt」というファイルが既に存在するので、コピー先に存在していた「dest.txt」をバックアップファイルとして退避しています。


強制上書き(-f)


OS自体の設定にもよりますが、ファイルをコピーすると上書きになる場合、「上書きします。よろしいですか?」のメッセージが表示されます。
「-f」オプション、または、「–force」オプションを使用すると、この上書き確認メッセージを表示しません。


$ ls -la
total 12
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:34 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    0 2020-01-29 01:36 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:34 src.txt
$ cp -f src.txt dest.txt
$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:34 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:34 src.txt

上記コマンド結果のように、同じファイル名でコピーしたとしても、上書き確認メッセージは表示されません。


必ず上書き確認メッセージを表示(-i)


先ほどの強制上書きでも記載しましたが、「上書きします。よろしいですか?」のメッセージが表示されるかどうかは、OS自体の設定に依存します。
「-i」オプション、または、「–interactive」オプションを使用すると、上書き確認メッセージを必ず表示することができます。


$ ls -la
total 12
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:49 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    0 2020-01-29 01:49 src.txt
$ cp -i dest.txt src.txt
cp: overwrite `src.txt'? yes
$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:49 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:49 src.txt

上記コマンド結果のように、上書きコピー時に「 overwrite `src.txt’?」という確認メッセージを表示しています。
yesと入力すると、ファイルが上書き更新されます。


同名ファイルの場合は上書きしない(-n)


同名ファイルを上書きしたくない場合は、「-n」オプション、または、「–no-clobber」オプションを指定すると、上書きは行われません。


$ ls -la
total 12
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 02:08 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    0 2020-01-29 02:04 src.txt
$ cp -n dest.txt src.txt
$ ls -la
total 12
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 02:08 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    0 2020-01-29 02:04 src.txt

属性情報(タイムスタンプなど)をそのままにしてコピー(-p)


タイムスタンプ・グループ・所有者といった属性情報はそのままにしてコピーする場合は「-p」オプション、または、「–preserve」オプションを指定します。


$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-02-05 00:38 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 src.txt
$ cp -p src.txt dest.txt
$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 src.txt

フォルダをコピー/再帰的にコピー(-r)


フォルダをコピーする場合は「-r」オプションを指定します。

このオプションを指定すれば、フォルダの中身がそのまま表示されます。

フォルダをコピーというよりも、フォルダの中身を再帰的にコピーするという動きになります。


$ ls -la
total 12
drwxr-xr-x 3 xxx yyy 4096 2020-02-05 00:49 .
drwxr-xr-x 8 xxx yyy 4096 2019-09-10 01:01 ..
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 dir
$
$
$ ls -la ./dir/
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 .
drwxr-xr-x 3 xxx yyy 4096 2020-02-05 00:49 ..
-rw-r--r-- 1 xxx yyy    4 2020-02-05 00:40 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 src.txt
$ cp -r dir dir2
$ ls -la
total 16
drwxr-xr-x 4 xxx yyy 4096 2020-02-05 00:50 .
drwxr-xr-x 8 xxx yyy 4096 2019-09-10 01:01 ..
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 dir
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:50 dir2
$ ls -la ./dir2/
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:50 .
drwxr-xr-x 4 xxx yyy 4096 2020-02-05 00:50 ..
-rw-r--r-- 1 xxx yyy    4 2020-02-05 00:50 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-02-05 00:50 src.txt