投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2015年12月27日日曜日

【Linux CentOS 6.6】あるディレクトリ以下にある全ファイルの内容を破壊し、なおかつ削除する方法


単純にファイルを削除するだけでは、特別な方法によってファイルが復元される可能性が高い。
そのため、ファイルの内容を出鱈目な値によって上書きして破壊してから削除を行うことで、それを難しくする。



<注意>
操作を間違えると、大切なファイルをまで破壊してしまうことになるので、注意すること。

以下のコマンドは、CentOS 6.6で、試したものである。



(例)
カレントディレクトリに存在する TargetDir ディレクトリ下(サブディレクトリも全て)の全ファイルを破壊し、なおかつ削除する。

まず、抹消対象になるファイルの一覧を得て、安全確認を行う。
$ find ./TargetDir/ -print0 -type f | xargs -0 echo

抹消してよければ、続いて次の抹消用コマンドを発行する。
$ find ./TargetDir/ -print0 -type f | xargs -0 shred -u


パイプ(|)の前では、対象のファイルパス一覧を取得している。
後は、shredコマンドによってファイルの内容を破壊し、-uオプションによって削除も行っている。

その他のコマンドの意味は、次のページを参照してください。
http://akira-arets.blogspot.jp/2011/07/linuxxargscp.html



上記処理においてファイルでなく、ディレクトリに対してshredコマンドが実行された場合、
次のようなメッセージが表示される。

shred: ./FILE/Directory/SubDirectory: failed to open for writing: Is a directory

ところで、この作業中に、jbd2/dm-0-8 というプロセスが topコマンドのリスト上に現れた。
これは、ファイルシステム(今回はext4)のジャーナリングプロセスらしい。(†2)



<参考>
(1)
【Linux CentOS5】ディレクトリ階層に分けて置かれた複数のファイルを条件指定で抽出し、別のディレクトリにまとめてコピーする【xargsと、cpコマンドの組み合わせ】
< http://akira-arets.blogspot.jp/2011/07/linuxxargscp.html > 2015年12月27日

(2)
jbd2/dm-0-8
<https://linuxacademy.com/community/posts/show/topic/173-jbd2dm08> 2015年12月30日

2015年12月13日日曜日

【MS SQLServer Express 2008 R2】SQLServerの起動時にストアドプロシジャをスタートアップさせ一時テーブルを復元する設定【Windows 8.1 Pro 64bit】

処理するのに時間のかかるストアドプロシジャを、予めスタートアップ時に実行し、
その結果を一時テーブルに保存し、他からのリクエストに応じられるようにする方法について



■ポイントは、二つである。

<0>導出を担当する「導出ストアドプロシジャ」を作成する

これは導出に時間を要するものとする。
既にユーザーデータベース内に作成されているものとする。


<1>導出結果をテンポラリテーブルに保存する「構成用ストアドプロシジャ」を作成する

導出をリクエストするたび処理に時間を要するストアドプロシジャは、
予め実行しておき導出結果をテンポラリテーブルに保存しておく。
結果を保持しているこのテンポラリテーブルに対してリクエストすれば速いからだ。


<2>スタートアップ時に自動的に実行されるように「構成用ストアドプロシジャ」を登録する

テンポラリテーブルは、SQL Server のシャットダウン(再起動)時に、自動的に消去される。
そのため再起動毎にテンポラリテーブルが自動構成されるように、
「構成用ストアドプロシジャ」をSQL Server のスタートアップに設定する。



◆スタートアップによって最終的に実行される、構成用ストアドプロシジャの作成を先ず行った


作成したテンポラリテーブル「構成用ストアドプロシジャ」は、
sp_TEST_StoreResultDataTo_TmpTable_TBLResult である。
ユーザーデータベース MYDataBase に保存した。
(スタートアップによって、最終的にこの構成用ストアドプロシジャが実行されるようにしたい。)  
USE MyDataBase
GO

CREATE PROC [dbo].[sp_TEST_StoreResultDataTo_TmpTable_TBLResult]
AS

    CREATE TABLE tempdb.dbo.TmpTable_TBLResult
        (
        コード int NULL
        ,名前 nvarchar(100) NULL
        )

    INSERT INTO tempdb.dbo.TmpTable_TBLResult
        (
        コード int NULL
        ,名前 nvarchar(100) NULL
        )
        Exec [dbo].[sp_TEST_ReturnResultData--時間のかかる導出用プロシジャを呼び出し


コードの説明:

この sp_TEST_StoreResultDataTo_TmpTable_TBLResult を実行すると、
テンポラリデータベース内 tmpdb にテンポラリテーブル TmpTable_TBLResult が作成され、
ここに既存の別のストアドプロシジャ sp_TEST_ReturnResultData による導出結果を、保存される。

作成するテーブルの構造は、sp_TEST_ReturnResultData による導出結果に合わせること。

この方法で作成されたテンポラリデータベース内の、テンポラリテーブル(名前の頭に#や、##を付けない)は、
接続セッションを問わずにアクセス可能であり、
SQL Server のシャットダウン時には自動的に削除される。



◆ユーザーデータベース内のストアドプロシジャをスタートアップ時に実行されるように設定する

スタートアップ時に、上記ユーザデータベース内の「構成用ストアドプロシジャ」が実行されればよい。

しかし、スタートアップに登録されるストアドプロシジャは、master データベース内に存在する必要がある
そのため、スタートアップ時に実行可能なストアドプロシジャ内部から、
ユーザーデータベース内のさきの「構成用ストアドプロシジャ」を実行するようにする。


○スタートアップ時に直接実行されるストアドプロシジャを次のように作成した。
USE [master]
GO

CREATE PROC [dbo].[sp_startup_userproc]
AS
   
    Exec [MyDataBase].[dbo].[sp_TEST_StoreResultDataTo_TmpTable_TBLResult]


コードの説明:
sp_startup_userproc は、master データベース内に保存されるストアドプロシジャである。
この中から、ユーザーデータベース MyDataBase 内の、既に作成済みの「構成用ストアドプロシジャ」を実行する。


○スタートアップの登録を行う。

この作成したストアドプロシジャ sp_startup_userproc を、次のようにしてスタートアップに登録する。
USE [master]
GO

sp_procoption   
    @ProcName = '
sp_startup_userproc',
    @OptionName = 'startup',
    @OptionValue = 'on'  --解除する場合は、off




これらによって、SQL Server が起動されるとき、一連のストアドプロシジャが実行される。


まとめると、次のような流れになる。
<SQL Server スタートアップ>
 ↓
(スタートアップ時に直接実行されるmasterデータベース内のストアドプロシジャ)
[master].[dbo].[sp_startup_userproc]
 ↓
(副次的に呼び出されるユーザーデータベース内の構成用ストアドプロシジャ)
[MyDataBase].[dbo].[sp_TEST_StoreResultDataTo_TmpTable_TBLResult]

この結果、起動時には必要なテンポラリテーブル tempdb.dbo.TmpTable_TBLResult が復元される。
あとは、任意のストアドプロシジャから、この構成済み一時テーブルを自由に使えばよい。




(参考 : 一時テーブルについて )
・Local and global temporary tables in SQL Server
<http://stackoverflow.com/questions/2920836/local-and-global-temporary-tables-in-sql-server> 2015年12月11日

・How to insert data from one table to another table
<https://blogs.technet.microsoft.com/mdegre/2009/09/08/how-to-insert-data-from-one-table-to-another-table/> 2015年12月11日

・Temporary Tables and Table Variables in Microsoft SQL Server 2008 T-SQL Programming
<https://www.microsoftpressstore.com/articles/article.aspx?p=2233324> 2015年12月11日

・In SQL Server 2008 ,is it possible to disable auto drop of global temp table
<http://stackoverflow.com/questions/2826282/in-sql-server-2008-is-it-possible-to-disable-auto-drop-of-global-temp-table> 2015年12月11日


( 参考 : スタートアップに関して )
・sp_procoption is not executing strored procedure with OPENQUERY
<http://stackoverflow.com/questions/31213192/sp-procoption-is-not-executing-strored-procedure-with-openquery> 2015年12月11日

・Configure Stored Procedures to Automatically Run at SQL Server Startup
<http://zarez.net/?p=1566> 2015年12月11日

・sp_procoption (Transact-SQL)
<https://msdn.microsoft.com/en-us/library/ms181720.aspx> 2015年12月11日

2015年7月20日月曜日

【CentOS 7 LiveCD 1503】Windowsディスク(NTFS)をマウントし、ddコマンドからファイルの入出力を行う手順

更新 2016年12月18日(ntfsフォーマットツール)

CentOS 7 LiveCDで起動したLinux環境において、
Windowsディスク(NTFS)に保存されたディスクイメージファイルを、指定したデバイスに、
ddコマンドを使って書き込む手順


【CentOS 7 LiveCD環境の準備】

■必要なファイルをダウンロードし、
 LiveCDをUSBメモリーに書き込み、そこからLinuxCDを起動した


○必要なファイルをダウンロードした

<CenOS 7 LiveCDのisoファイル>
 CentOS-7-x86_64-LiveCD-1503.iso

<unetbootin-windowsの実行ファイル>
下記サイトから、Windows用のプログラムをダウンロードした。
 http://osdn.jp/projects/sfnet_unetbootin/
 unetbootin-windows-608.exe
 
○Windows環境にて、ダウンロードしたunetbootin-windows-608.exeを起動した。

開いたウインドウで「ディストリビューション」でなく、「ディスクイメージ」を選択し、
ダウンロード済みCentOS 7 LiveCDのISOファイルを指定し、書き込みを開始した。


○その後、書き込み済みのUSBメモリーでPCを起動した。
CentOS 7 LiveCDが立ち上がった。
さらに、LANケーブルを接続しインターネットに接続できる状態にした。



【CentOS 7 LiveCD環境立ち上げ後】

■WindowsのファイルシステムであるNTFSを読み書きできるように準備した

上記CentOS 7 LiveCDでは、デフォルトではNTFSを読み書きできない。
まず、次のようにして必要なパッケージをインストールした。

$ su
# yum install epel-release

1、(ntfsフォーマットツールも含める場合)
# yum install ntfsprogs

2、(ntfsマウントだけできれば良い場合)
# yum install ntfs-3g

次に、Windowsのハードディスク(NTFS)をマウントしてアクセスできるようにした。
ディスクのデバイス名は、fdisk -l で確認できる。間違ったパーティションを選択しないように注意する。
(例)/dev/sdaとして認識されたWindowsディスクのパーティションXを/mntにマウントする。

# mount -t ntfs /dev/sdaX /mnt



■マウントできたWindowsディスクにあるファイルを、指定したデバイスに書き込んだ

上記でマウント済みのWindowsファイルシステムにチェンジディレクトリ
# cd /mnt

ddコマンドで、同ディレクトリ内のdisk.imgを、指定したデバイスに書き込み
(書き込み先のデバイスの指定には十分に注意すること!データが破壊される!)
# dd if=disk.img of=/dev/sdX


進捗状況を確認するには、次のようにする。
まず、別のターミナルウインドウを開いて、次のようにコマンドを実行する。

# su

動作中ddのプロセス番号を検索
# ps -A | grep dd

次のコマンドで検索したプロセス番号を指定
# kill -SIGUSR1 プロセス番号

すると、ddが動作しているターミナルで、進捗状況が一回表示される。
さらに確認したい時には同様にすればいい。 

以上

2015年7月4日土曜日

【Thunderbird 31.7.0 64bit】アドオンなしで、アカウントのリスト表示順を変更する方法について【Linux CentOS 6.6 64bit】

メールソフトThunderbirdにおいて、
デフォルトで左ペインに表示されている「ユーザーアカウント情報の並び順」を変更する方法について。

ただし、以下の方法ではアドオンなど追加ソフトの導入は行わないで設定を行っている。



<目標>
Thunderbirdでは、管理するメールユーザーを追加したとき、
新規ユーザーに関する情報(受信トレイなど)が、最下位に表示される。
この表示位置を変更する。


<方法>
Thunderbirdの設定情報を書き換えることで実現する。


<手順>

1、次のようにして、専用設定エディタを開く

Thunderbirdのメインウインドウ右上にある 」のような形のアイコンをクリックして、
表示されたメニューの「設定」項目にマウスカーソルを重ね、
さらに表示されるメニューから「設定」をセレクトする。

開いたウインドウ上部の「詳細」ボタンをクリック、さらにその「一般」タブを開き、
下方にある「設定エディタ」ボタンをクリックする。

「動作保証対象外になります!」と警告されるので、確認後に、
チェックボックスにチェックマークを付けた後に、「細心の注意を払って使用する」をクリックする。



2、対象のアカウントの番号を確認する

表示された検索ボックスに次の文字列を入力すると、
下部に設定済みアカウントのEmailアドレスとアカウント番号の組が表示される。
mail.identity.id*.useremail
対応する左の設定名列に表示される文字列から、idにつづく番号を確認する。
この番号がアカウント番号なので覚えておく。

例として、mail.identity.id15.useremail ならば、「15」がアカウント番号である。



3、アカウントの並びに関係する設定項目を検索して、その値を確認する

検索ボックスに次の文字列を入力すると、下部にその設定項目が表示されるので、
ダブルクリックする。
mail.accountmanager.accounts
値を書き換えるためのウインドウが開く。
文字列を選択して”コピー”をとり、適当なエディタに貼り付けて(4、)のように編集する。

(ところで、mail.accountmanager.defaultaccount設定項目に設定されたアカウントは、
常にトップに表示されるらしい。†1)



4、アカウントの並び順を定義する値を再構成し、再設定する。

値を貼り付けたエディタにて、次のように表示されている場合、
account1,account2,account3,account4,account5,account6,account7,account8,account9,account10,account11,account12,account13,account14,account15,account16

例としてアカウント番号「15」の表示を上から二つ目に変更するには、次のように構成する。
account1,account15,account2,account3,account4,account5,account6,account7,account8,account9,account10,account11,account12,account13,account14,account16

再構成した文字列のコピーをとったあと、手順3に返ってペーストする。
(ウインドウに表示されている旧設定情報文字列を上書きし再設定する。)



5、Thunderbirdを再起動する。


アカウント情報が意図した順番で表示されるようになった。




(参考)
†1 Thunderbird/Change account order
< https://sidvind.com/wiki/Thunderbird/Change_account_order > 2015年7月4日

2015年6月11日木曜日

【Postfix 2.6.6 x86_64】接続元クライアントのIPアドレス、ホスト名、メーラーなどを表示させないようにする【Linux CentOS 6.5 64bit】

ネットワーク内に設置しているPostfix経由でクライアントマシンからSMTPで外部宛メールを送信した。
受け取り先に到達したメールを確認すると、送信元周りの情報が含まれていた。(下記)

・送信元クライアントマシンの情報 (Receivedで始まる行)
・利用しているクライアントメールソフトウェア (X-Maillerで始まる行)
(略)

Received: from localdomain (unknown [192.168.111.111])
    by mailserver.localdomain (Postfix) with SMTP id xxxxxxxxx
    for <dest@example>; Wed, 10 Jun 2015 00:00:00 +0900 (JST)

Date: Wed, 10 Jun 2015 00:00:00 +0900
From: user <user@localdomain>
X-Mailer: Your Mail Software ( MUA )
MIME-Version: 1.0
To: dest@example
Subject: test mail
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

this is test for mail
 
これらの情報は、経由するPostfixにおいて、
受け取ったメールのヘッダーの取り扱いを制御することで、排除することが可能である。
先の送信元周りの情報を含んだヘッダーを無視する設定を行えばリレー先に情報を伝えない。 
 




(手順)
 
1、各ヘッダーの取り扱いを定義する。
 
次のファイルに、下記のように正規表現を使ってヘッダーを指定し、制御情報を追記した。
(上のヘッダー例に対しては無意味な設定も含んでいる。また必要に応じて追記する。) 
 

# vim /etc/postfix/header_checks
(略)
/^Received:.*with ESMTPSA/          IGNORE
/^Received:.*with ESMTP/              IGNORE

/^Received:.*with SMTP/                IGNORE
/^X-Originating-IP:/                        IGNORE
/^X-Mailer:/                                    IGNORE


/^User-Agent:/                               IGNORE
/^Mime-Version:/                            IGNORE


2、上で行った定義を利用する設定を行う。

下記の2行を追記した。

# vim /etc/postfix/main.cf
mime_header_checks = regexp:/etc/postfix/header_checks
header_checks = regexp:/etc/postfix/header_checks



3、Postfixを再起動した。

再びテストメールを送信して、受け取り先において確認すると、
定義したとおりヘッダーは伝達されていなかった。(下記)

(略:ここから上は、リレー先である管理外のサーバが追記する情報が入る。)
Date: Wed, 10 Jun 2015 00:00:00 +0900
From: user <user@localdomain>
To: dest@example
Subject: test mail
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
this is test for mail



 <参考>
・Remove sensitive information from email headers with postfix
< https://major.io/2013/04/14/remove-sensitive-information-from-email-headers-with-postfix/ >
2015年6月11日

・Postfix Hide Client (MUA) System IP Address / Hostname
< http://www.cyberciti.biz/faq/postfix-remove-hide-hostnames-ip-addresses/ > 2015年6月11日

・When sending email with Postfix, how can I hide the sender’s IP and username in the Received header?
< http://askubuntu.com/questions/78163/when-sending-email-with-postfix-how-can-i-hide-the-sender-s-ip-and-username-in >
2015年6月11日




2015年6月3日水曜日

【Firefox 64bit 38.0.1】Firefoxメニューが英語で表示されるようになったので日本語に切り替えた【Linux CentOS 6.6 64bit(gnome)】

このページの方法で日本語化ができない場合、次のリンク先の方法で日本語できた。
これはThunderbirdの設定方法であるが、Firefoxでもやり方はほとんど同じである。
http://akira-arets.blogspot.com/2016/10/thunderbird-language-setto-japanese.html



CentOS 6.6 64bitのgnome環境を、VNC SERVERを用いて利用している。
このgnome環境でブラウザFirefox(38.0.1)を使用していた。
gnome、Firefox共に日本語で表示されていた。

ところがあるときから、急にFirefoxでメニューなどが英語表記されるようになってしまった。
それまで日本語表示できていたから、必要な追加パッケージが導入されていないわけではない。


次のようにFirefoxを設定するだけで、きちんと日本語表示に復帰させることができた。



▲Firefoxで日本語環境に復帰させる手順▲

(1) Firefoxのアドレスバーに、次の値を入力してエンターキーを押す。
about:config
動作保証ができませんので、細心の注意を払って編集するようにとの警告が表示された。
さらに進むと、設定を変更するツールが開かれた。

以下は、このツールでの操作である。


(2) 次の項目を検索ボックスに入力して、項目と値を表示させた。
intl.locale.matchOS
次の情報が表示された。この値がfalseになっていることを確認した。
intl.locale.matchOS   false
(もし、項目の値がtrueになっている場合は、ダブルクリックをしてfalseに設定する。)



(3) 次の項目を検索ボックスに入力し、項目と値を表示させた。
general.useragent.locale
下のリストに、次の情報が表示された。
(ここでFirefoxが英語環境になっていることがわかった。)

general.useragent.locale   en-US

表示された項目をダブルクリックして、値の編集ウインドウを開き、次の値を入力した。
(これによって、日本語環境に切り替えた。)
ja

(4) Firefoxを閉じて、数秒おいてから、Firefoxを再び起動した。

すると、日本語環境に戻った。

新品価格
¥0から
(2018/5/16 15:23時点)

新品価格
¥2,052から
(2018/5/19 14:45時点)


<参考>
Can we change the interface language of Firefox?
< https://support.mozilla.org/ja/questions/1018686 > 2015年6月3日

2015年5月27日水曜日

CANON製レーザープリンタドライバとOpenOfficeやLibreOfficeの用紙設定に相性問題があるのではないか

更新 2020年3月4日

純正のプリンタドライバをインストールしたWINDOWSマシンやLINUXマシンにおいて、
OpenOffice、LibreOfficeでの用紙設定がうまくされない、(プリントアウトウィンドウでのプレビュー)
また実際に間違った向きでプリントアウトされる問題についてのメモ。

キャノン製プリンタはTCP/IPでネットワーク経由で利用している。



■不具合が生じた環境■

Windows / Linux それぞれ、複数のPCでいくつかの関連しそうな現象を確認できた。

<Windows環境>
Windows 7 pro 64bit
Windows 8.1 pro 64bit

・キャノンプリンタドライバ
LIPS LX プリンタードライバー (64bit) Ver.21.45 < winlipslxver2145x6400.exe >

・キャノンプリンタ (TCP/IPでネットワーク経由)
手差しトレイにA5用紙をセットし、設定済み
LBP8710e
LBP8610

・オフィスソフトウェア(A5横向き文書のプリントアウト要求)
LibreOffice 5
LibreOffice 4 (LibreOffice 4.3.7)
OpenOffice 3


<Linux 環境>
CentOS 6.6 64bit
(2.6.32-504.16.2.el6.x86_64 #1 SMP Wed Apr 22 06:48:29 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux)

・キャノンドライババージョン
LIPS4 Printer Driver for Linux Ver.2.90 (64bit)
< linux-lipslx-printerdriver64-v290.tar.gz >

・キャノンプリンタ(TCP/IPでネットワーク経由)
手差しトレイにA5用紙をセットし、設定済み
LBP8710e

・オフィスソフトウェア(A5横向き文書のプリントアウト要求)
LibreOffice 4 (LibreOffice 4.0.4.2-14.el6)



■問題の内容■

上記のとおり、LibreOfficeや、OpenOfficeソフトからプリントアウトを行ったときに問題が生じた。


○Windows環境におけるプレビューとプリントアウトの問題

キャノン製プリンタを導入しPCにプリンタドライバが導入されている環境(上記のような環境)で、
OpenOffice、LibreOffice(表計算ソフトウェア)から、キャノンプリンタへA5サイズの文書をプリントアウトするとき次の問題が生じた。

テストした文書はA5サイズ(横)、
出力先のLBP8710eの手差しトレイには、A5サイズが設定されている。

プリントアウトウインドウにおいて、文書ページ自身に設定された用紙設定がプレビューに正しく反映されない。
そして、実際にプリントされる用紙の向きが正しくない。
(Windows標準の「Fax」「XPS Document Writer」を出力先としてセレクトしたとき、この問題は生じない。文書に応じて正しい向きの用紙でプレビューできた。)

古いキャノンプリンタドライバが導入されているPCにおいては、不正なプレビュー時にプリンタ設定で用紙の向きをセットすることによって、正しいプレビューとプリントアウトを得られた。
しかし、ここに上記の新しいドライバでプリンタを追加すると、問題が生じるようになった。
文書の縦横の向きを正そうとしても、プレビューに反映されなくなった。



○Linux環境におけるプリントアウトの問題

印刷ウインドウでのプレビューが正しくても、プリントアウトすると用紙の向きがおかしい。
テストした文書はA5サイズ(横)、
出力先のLBP8710eの手差しトレイには、A5サイズが設定されている。
A5サイズ(横)文書のプレビュー段階では正常だとしても、実際にLBP8710eへプリントアウトすると縦横の向きがおかしく、一部しかプリントされない。

カセットにA5用紙が設定されているiR C2550カラーレーザープリンタにプリントアウトしたときは、
正しい向きでプリントアウトされた。(手差しトレイでは試せていない。)



■問題を避ける方法について■(その3)

LibreOfficeの各文書で、ページスタイルの用紙サイズを変更する方法

うまくプリントアウトできなかったA5サイズ(横向き)のCalc文書を開き、
そして、上部メニューの「書式」から「ページ(P)」を開いた。
次の図のウインドウが開くので、次の手順で編集した。

1、用紙サイズの「サイズ名(F)」で「A5」を選択し、
「印刷の向き」を「横(A)」に設定した。(下の図)


2、次に、用紙サイズの「高さ(H)」を、14.85 cm に変更した。
そうすると、自動的に、サイズ名は”ユーザー”に変更された。(下の図)


3、「OK」ボタンをクリックし、必要があれば文書を上書き保存しておく。


以上により、文書に設定したサイズを示す枠線が現れた。

後は、いつものようにプリントアウト操作を行うと、正しくプレビューが表示されA5でプリントアウトできた。


原因は、下記参考サイトの方がおっしゃっているように、
キャノンプリンタードライバのA5の用紙サイズと、LibreOfficeのA5の用紙サイズとが不一致になっているからではないかと考えられる。



■問題を避ける方法について■(その2)

次の組み合わせで、下記の問題を避けることができた
A5横向き文書のプリントアウトができるようになった。


テストOS環境は、Windows 8.1 64bit

・キャノンプリンタドライバ
GLX プリンタードライバー (64bit) Ver.2.12 (機種共通プリンタードライバー)

・オフィスソフトウェア(A5横向き文書のプリントアウト要求)
Apache OpenOffice 4.1.2 日本語版
(Libre Officeも試したが、これは変わらず不可だった。)



■問題を避ける方法について■(その1)

OpenOffice、LibreOfficeからキャノンプリンタへ直接プリントアウトをしないで、
OpenOffice、LibreOfficeドキュメントをPDF化してから、別ソフトウェアからプリントアウトする
PDFファイルは、Adobe ReaderやWindows標準ソフトで開いて、プリントアウトした。
用紙サイズや向きが間違っている場合は、ここで設定変更した。



(参考)
・A5横のドキュメントが印刷されなかった(解決済み)
< http://document-foundation-mail-archive.969070.n3.nabble.com/A5-td4264939.html > 2020年3月4日

2015年5月24日日曜日

【Linux CentOS 6.6 64bit】VNC SERVERの起動中、SElinuxがtimeout in locking authority file.(Xauthority)を引き起こし起動に失敗した【tigervnc-server 1.1.0】

旧いマシンから新しいマシンに移行作業をしていた。
旧いマシンの/homeの内容を新しいマシンに移行することで、ユーザー環境を引き継いだ。

ところが、tiger-vncserverの起動中(service vncserver start)に、次のエラーが表示された。
時間がかかった後にコマンドは終了した。
VNCクライアントで対象の画面を表示させると、真っ暗になっていて、×印のマウスカーソルが表示されていた。

(エラー文)
33:testuser xauth: timeout in locking authority file /home/testuser/.Xauthority

.Xauthorityに対するパーミッションも正常である。

結局、SElinuxの切り忘れが原因だった。

次のページの方法で、SElinuxを無効にした。(再起動が必要)

http://akira-arets.blogspot.jp/2012/03/centos6-disabled-selinux.html



また、試行錯誤する段階で、.Xauthorityを削除してしまっていたが、
再び、service vncserver startを実行することによって、次のように表示されて自動生成された。
33:testuser xauth:  creating new authority file /home/testuser/.Xauthority

そうして、無事にGNOMEの画面を得られた。

2015年5月23日土曜日

【SAMBA 3.6.23 x86_64】SAMBAサーバーを新規マシンに移行する方法について(SAMBAユーザーアカウント情報tdbsamの移行方法)【Linux CentOS 6.6 64bit】

(不具合が発生するかもしれないので注意)
以下の方法でsambaユーザー情報を複製したシステムで、下記のように不具合が生じた。
ただし因果関係があるかどうかはっきりしない。

数ヵ月動作させていると、次第にsambaに新規に接続するユーザーの認証が遅くなっていった。
これは次第にひどくなっていって、最終的にはタイムアウトするようになってしまった。
 この問題は再起動によって一度は回復したものの、また後になって、
次のように、急に認証不能状態に陥ってしまった。

新規に接続するユーザーは認証に成功せずにタイムアウトになる。
この場合でも、既に認証を済ませているユーザーは、問題なく使用し続けることができていた。
このときには、sambaの再起動、マシン全体の再起動によっても回復しなかった。
データは無事であった。

ただし、この件について、数か月後に問題が生じるようになったこともあり、
因果関係は明らかではない。

これを受けて、今後は下記のような方法をとらずに、
1ユーザーずつ pdbedit -a コマンドで追加していこうと考えている。



新しいマシンに新規にOSを導入した後、古いマシンで動作していたSAMBA環境を移行した。


■前提事項

・SAMBAのユーザー管理は、tdbsamで行っているものとする。
(security = user
 passdb backend = tdbsam)

・新しいマシンにおいて、SAMBAがインストールされて、アクセス可能な状態になっていること。
(iptables、selinuxなどに注意)

・新しいマシンに、共有対象ファイルが適切な場所に、かつ適切な所有者や権限で移行されていること。
(rsyncで行った。)

・新しいマシンにおいて、passwd、shadow、group、gshadowのリストアが問題なく行われていること。
(絶対に単純に古いファイルによって置換してはいけない。500番以降の情報のみ扱った。)

・新しいマシンにおいて、SAMBAサービスが停止していること。



■SAMBA設定ファイルのリストア

移行先の新しいマシンにおいて、次の操作を行った。


1、オリジナルのsamba設定ファイルをつぎのようにしてディレクトリごとバックアップした。
# mv /etc/samba /etc/samba.org

2、旧来の設定ファイルをコピーした。(ファイルの所有者、権限に注意)
# cp backup/samba /etc/ -r



■SAMBAユーザーアカウントデータベース(tdbsam password database)のリストア

移行先の新しいマシンにおいて、次の操作を行った。


1、データーベースが保存されている場所を調べた。
# smbd -b | grep PRIVATE_DIR
PRIVATE_DIR: /var/lib/samba/private

2、オリジナルのtdbファイルを次のようにしてバックアップした。
# mv /var/lib/samba/private/passdb.tdb /var/lib/samba/private/passdb.tdb.org


3、旧来のデータベースファイル(backup/passdb.tdb)をコピーした。
(ファイルの所有者、権限に注意)
# cp backup/passdb.tdb /var/lib/samba/private/passdb.tdb



■動作確認

○ユーザーアカウントが保持されているか確認した。

次のコマンドで、アカウント一覧が表示された。
# pdbedit -L


○SAMBAサービスを起動し、アクセスできるか確認した。

サービスの起動を行った。
# service smb start

問題なくサービスが起動して、登録されているユーザーでアクセスすることができた。



<参考>
・[Samba] Where is the tdbsam password database file?
< https://lists.samba.org/archive/samba/2007-September/135288.html >

2015年5月19日火曜日

Windows 8.1(UPDATE)インストーラーをフラッシュメモリに書き込んでインストーラーを起動できるようにする方法

Windows 7(sp1) pro 64bit版で作業を行った。


用意したもの:

・Windows のインストール用DVDメディア(今回は、Windows 8.1 UPDATE pro 32bit版を用意した。)
4GB以上のフラッシュメモリ(今回はUSBディスクを使った)

フラッシュメモリは、フォーマットに時間がかかるため、インストーラーが収まる最少の容量のものを使った。


作業手順:
(0)準備
(1)リムーバブルディスクの選択とフォーマット。(注意!フォーマットには時間がとてもかかる。)
(2)USBディスクのブートセクタに起動用のコードを書き込む。
(3)インストーラーDVDの内容をUSBディスクに書き込む。



(0)コマンドプロンプトを管理者権限で起動した。

スタートボタンを押し、「すべてのプログラム」→ 「アクセサリ」を開き、
その中の「コマンドプロンプト」項目上で、右クリックメニューから「管理者として実行(A)」を選ぶ。

コマンドプロンプトウインドウが起動した。


リムーバブルUSBディスクを、USBポートに取り付けた。



(1)次の手順で状況を確認しながら、リムーバブルディスクを選択しフォーマットを行った。

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.


●diskpartコマンドを起動した。
C:\Windows\system32>diskpart

Microsoft DiskPart バージョン 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
コンピューター: PC NAME

○list volumeコマンドで、ボリューム状態を確認した。
DISKPART> list volume

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0    D                      DVD-ROM         0 B  メディアなし

  Volume 1        システムで予約済み    NTFS  Partition    100 MB  正常       シ
ステム
  Volume 2    C                NTFS  Partition    146 GB  正常       ブート

  Volume 3    E   ボリューム        NTFS  Partition     86 GB  正常

  Volume 4    F   Lexar        FAT32 リムーバブル      7646 MB  正常

●list diskで、リムーバブルディスクのディスク番号を確認し、選択した。
(注意!間違えると、ハードディスクの内容を喪失してしまう!)

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           232 GB  1024 KB
  ディスク x    オンライン          7648 MB      0 B  ( ←これがUSBディスク )

DISKPART> select disk x ( ←実際には、環境に応じて番号を入力する )

ディスク x  が選択されました。

○選択したディスクのパーティションの状態を確認した。
DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ             7646 MB  1132 KB

●cleanコマンドを実行した。(既存のパーティションが消えるので注意!)
DISKPART> clean

DiskPart はディスクを正常にクリーンな状態にしました

○パーティションの状態を確認した。
DISKPART> list partition

このディスクには表示するパーティションがありません。

●パーティションを作成した。
(このコマンドの使い方の確認)
DISKPART> create

Microsoft DiskPart バージョン 6.1.7601

PARTITION   - パーティションを作成します。
VOLUME      - ボリュームを作成します。
VDISK       - 仮想ディスク ファイルを作成します。
DISKPART> create partition

Microsoft DiskPart バージョン 6.1.7601

EFI         - EFI システム パーティションを作成します。
EXTENDED    - 拡張パーティションを作成します。
LOGICAL     - 論理ドライブを作成します。
MSR         - Microsoft 予約パーティションを作成します
PRIMARY     - プライマリ パーティションを作成します。

DISKPART> create partition primary
DiskPart は指定したパーティションの作成に成功しました。

●作成したパーティションを確認し、アクディブにした。
DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
* Partition 1    プライマリ             7647 MB  1024 KB
DISKPART> active

DiskPart は現在のパーティションをアクティブとしてマークしました。

●パーティションをフォーマットした。
DISKPART> format fs=fat32

   30% 完了しました

  100% 完了しました

DiskPart は、ボリュームのフォーマットを完了しました。

●ドライブレターを割り当てた
(システムに認識されて、内容表示のためのウインドウが開ける)
DISKPART> assign

DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

○システムのディスク状態を確認した。

Gドライブとして認識されていることがわかった。
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           232 GB  1024 KB
* ディスク 1    オンライン          7648 MB      0 B

DISKPART> list volume

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0    D                      DVD-ROM         0 B  メディアなし

  Volume 1        システムで予約済み    NTFS  Partition    100 MB  正常       シ
ステム
  Volume 2    C                NTFS  Partition    146 GB  正常       ブート

  Volume 3    E   ボリューム        NTFS  Partition     86 GB  正常

* Volume 4    G                FAT32 リムーバブル      7647 MB  正常


DISKPART>

●CTRL + Cで、diskpartコマンドを終了した。



(2)USBディスクのブートセクタに起動用のコードを書き込んだ。

DVDドライブ(dドライブ)にWindows 8.1のインストーラーDVDをセットした後、DVDドライブに切り替えた。
C:\>d:
さらに、bootフォルダへカレントディレクトリを切り替えた。
D:\>cd boot

専用コマンドでUSBドライブにブートコードの書き込みを行った。
(例では、GドライブがUSBディスクに割り当てられているので、注意。)
D:\>bootsect.exe /nt60 g:
Target volumes will be updated with BOOTMGR compatible bootcode.

G: (\\?\Volume{12345678-1234-1234-1234-123456789abc})

    Successfully updated FAT32 filesystem bootcode.

Bootcode was successfully updated on all targeted volumes.

(3)インストーラーDVDの内容をUSBディスクに書き込んだ。
(この例では、Windows 8.1 DVDディスクはDドライブ、書き込み先のUSBディスクはGドライブになっているので注意!)
D:\>robocopy d: g: /E

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー

-------------------------------------------------------------------------------

  開始: Tue May 19 00:00:00 2015

   コピー元 = D:\
     コピー先 = G:\

    ファイル: *.*

  オプション: *.* /S /E /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------
------------------------------------------------------------------------------
(表示省略)


以上で、Windows 8.1 インストール用のUSBディスクが完成した。

これを使ってインストーラーを起動するには、ターゲットPCのBIOS設定において、
USBポートから起動できるように変更を要する場合がある。

2015年5月9日土曜日

【Linux CentOS 6.5 64bit】ディレクトリ内のファイルに対して一気に特定の処理を施す方法【sedによる行丸ごと置換と上書き保存】

ディレクトリ内のファイルを一気に処理するための型 

for f in `find . -maxdepth 1 -type f` ; do 「処理内容 $f ; done

注意: 「`」は、「shift + @」で入力すること。


(説明)
find . -maxdepth 1 -type f によって、カレントディレクトリに限定して全ファイル名を取得する。
(-maxdepth 1 をはずすと、下階層にまで下ってファイル一覧が取得される。)
その取得されたファイルリストを使って「for f in」でループ処理させ、一気に処理を行う。

ところで、-maxdepth のオプションの位置に注意。間違えると次の警告文が現れた。
-maxdepthはオプションだが、-typeはオプションではない。 オプションは、他の要素の前に置くこと。
find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.


(「処理内容」の例)
テキストファイルの特定の行(文字列で指定される行)を別の文字列 で置換するため、
sedの次のコマンドを用いた。
c \text
Replace the selected lines with text,
which has each embedded newline preceded by a backslash.

選択される複数行がそれぞれ、”バックスラッシュ(「\」)を前置して指定されたテキスト”で置換され、行は更新される。

次のようにコマンドを作成した。
sed -i -e '/server/c\server          127.0.0.1' 処理されるファイル名
serverを含む行を、「server          127.0.0.1」という文字列の新しい行に置換する。
オプション -i によって、処理されるファイルは上書き 保存されるので注意!



ディレクトリ内のファイルを一気に処理するコマンドをとして、次のように作成した。
念のために、echo"処理内容"として、動作を確認するようにした。

for f in `find . -maxdepth 1 -type f` ; do echo " sed -i -e '/server/c\server          127.0.0.1' $f " ; done

注意: 「`」は、「shift + @」で入力すること。

これによって、実際に実行されるコマンド文字列が一覧できる。
コマンドが正しいことが確認できたら、echo "処理" から、echo""を取り外して、
実際に処理が行えるようにする。



(参考)
・sed cコマンドの動作 (指定文字列で行を置き換え) 【Linuxコマンド】
< http://blog.livedoor.jp/morituri/archives/52018209.html > 2015年5月9日

・man sed

・sedでファイルを上書き保存
< http://www.dab.hi-ho.ne.jp/sasa/biboroku/unix/sed-i.html > 2015年5月9日

2015年5月4日月曜日

【Linux CentOS 6.5 64bit】強制的にroot権限でスクリプトを動作させる方法

<追記 2020年11月7日>

 以下の方法は、CentOS 7 では動作しなかった。
代わりに、sudoを導入(yum install sudo)し、visudoでroot動作させる設定を行えた。
visudoを用いた設定方法は、下記を参考にしてください。


sudoを用いてroot権限で動作させるには、以上の設定の上、対象のコマンドやスクリプトの前に、sudoを前置させる必要がある。



※注意※
以下の方法はあくまでも、安全なローカル環境下、一般ユーザが使用しない環境で試すものです。


あるスクリプトが通常ユーザ権限で動作する場合、
その内部に「root権限が必要な処理」が記述されていると、失敗してしまう。


こういうとき、たとえば次のようにして制限を回避できる。

「root権限が必要な処理」だけ別プログラムとしてファイルに分離し、
SUID(=setuid)をそのファイルに設定し、所有者をrootに設定する。
SUIDが設定された実行ファイルは、
呼び出し元のスクリプトの実行権限に関係なく所有者の権限(この場合はroot)で動作する。
そして、これを元のスクリプトから呼び出すようにすればよい。

しかし、CentOS 6.5では、
スクリプトファイルにsetuidを設定しても、ファイル所有者権限で実行されなかった


そこで、さらに次のようにしてこの制限を回避した。

スクリプトを呼び出して実行するだけのバイナリプログラムを作成し、
これにSUIDを与え、所有者をrootとする。
これによって呼び出されたスクリプトは、root権限で動作することになる。


大元のスクリプト(通常ユーザで動作)
  ↓
  ↓呼び出し
  ↓
バイナリプログラム(SUIDにより、root権限で動作)
  ↓
  ↓呼び出し
  ↓
スクリプト (root権限で動作)



■次のように、C言語でプログラムを作成した。

(内容の説明)

引数として5つの文字列が指定できる。
sprintf関数で、それら引数を一つの文字列にフォーマットして、変数buffに格納する。

最初の引数は、root権限で実行させたいスクリプトへのパスを記述する。
2~5までの引数は、「そのスクリプトに渡す引数」をそれぞれ記述する。
したがって、これらが一つの文字列にフォーマットされると、
スクリプト名を先頭に引数を連ねた「コマンド文字列」が生成される。

setuid関数でrootを指定した上で、system関数にこの「コマンド文字列」を渡し実行させる。


[root@test etc]# vim caller-script-4arg.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
        char    buff[100];

        sprintf(buff,"%s %s %s %s %s",argv[1],argv[2],argv[3],argv[4],argv[5]);

        setuid( 0 );
        system(buff);

        return 0;
}

■コンパイルした
[root@test etc]# gcc caller-script-4arg.c -o caller-script-4arg


■実行できるようにした
[root@test etc]# chmod +x caller-script-4arg


■さらにSUIDを設定した
これによって、このバイナリファイルは「ファイル所有者(=root)の権限」で、実行される。

[root@test etc]# chmod u+s caller-script-4arg

○ls -all コマンドの結果
-rwsr-xr-x  1 root root    6841  4月 17 00:00 2015 caller-script-4arg
-rw-r--r--  1 root root     256  4月 17 00:00 2015 caller-script-4arg.c

これはあくまでも実験である。全てのユーザーに、このバイナリの実行権限を与えるべきではない


■動作確認
大元のスクリプトにおいて次のようにして記述した。(2例)
作成したバイナリプログラム(root, SUID)に、「test.shとその引数」を、5つの引数として与えた。
(test.shにも実行属性を与えておくこと。)

/etc/caller-script-4arg "/etc/test.sh" "uucp:${admittedgroup}" "${SAVETObase0DIR}" "750" " "

/etc/caller-script-4arg "/test/test.sh" "uucp:${admittedgroup}" "${SAVETODIR}" "770" "-R"

test.sh内には、chmodや、chownが含まれていたが、
root権限でtest.shが実行されたので、うまく処理ができるようになった。



(参考)
・setuid on shell scripts
< http://www.tuxation.com/setuid-on-shell-scripts.html > 2015年5月4日

・sprintf
< http://www9.plala.or.jp/sgwr-t/lib/sprintf.html > 2015年5月4日

・UNIX処方箋:SUIDとは
< http://www.itmedia.co.jp/enterprise/articles/0804/08/news014.html > 2015年5月4日

・setuid は慎重に
< http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b07_03.html > 2015年5月4日

2015年5月1日金曜日

【Postfix 2.6.6 x86_64】リレーの設定について【Linux CentOS 6.5 64bit】

更新 2020/07/18 フォールバックリレーについて


下記の図式が示す構成において、Postfix( localhost )を経由してメール送信した際の考察と、
上位SMTPメールサーバへメールをリレーさせるための設定方法について


[SMTPserver( B.domain.tld )]---[SMTPserver( A.domain.tld )]---[※Postfix(-sendmail)]---[Clientマシン]

※ホスト名を仮に、postfix.local.tld としておき、Clientマシンから名前解決できるようにしておく。


下記情報を踏まえたうえで、さらにSTARTTLSでリレー先SMTPサーバに接続したい場合や、
複数のリレー先を用意しておいて、バックアップとして用いたい場合は、次のページを参照
http://akira-arets.blogspot.jp/2016/02/postfix-relay-starttls.html


■Postfixに、relayhost の設定は行わない場合の動作テスト

その場合は、メールのあて先へ直接届けられる。(main.cfに書かれた下記のコメント参照)
# The relayhost parameter specifies the default host to send mail to
# when no entry is matched in the optional transport(5) table. When
# no relayhost is given, mail is routed directly to the destination.
<実験>
1、Postfixローカルにおいてsendmailコマンドで、someone@A.domain.tld へメールを送ることができた。
(ただし、gooleのgmailのアカウントへ送信すると、spamメールとして扱われた。)

外部のメールサーバ(A.domain.tld)は、「自身が管理するメールボックス宛のメール」を受け取った。


2、ClientマシンからPostfixへSMTPで、root@postfix.local.tld 宛メールを送ることはできた。

Postfix(postfix.local.tld)は、自分が管理しているメールボックス宛メールを受け取った。
/var/spool/mail/root に送達されたメールを確認できた。


3、ClientマシンからPostfixへSMTPで、someone@A.domain.tld 宛メールを送信しようとすると、失敗した。

このとき、次のエラーがPostfixで発生した。
postfix/smtpd[7218]: NOQUEUE: reject:(略)Relay access denied
リレーを要する送信アクセスは初期設定では受け付けないわけだ。



■Postfix( local )に、relayhost の設定を行った

Postfix(10.10.10.10)が上位のメールサーバ(A.domain.tld)へリレーできるように設定を行った。

下記のようにして、Clientマシンが属するネットワークアドレス(192.168.0.0/16)を記述した。
Postfix自身のアドレス(10.10.10.10/32と127.0.0.0/8)もしくはネットワークアドレスも含むようにすること。
(間違えると、Postfixは起動しなくなる。)

# vim main.cf
(略)
mynetworks = 10.10.10.10/32, 127.0.0.0/8, 192.168.0.0/16
(略)
relayhost = A.domain.tld:587 (←サブミッションポートを使用するのでポートを指定した)
(略)

以上、リレーを許可する設定を行った後に、
ClientマシンのMUAから、someone@A.domain.tld 宛へメールを送信テストを行った。

すると、ClientマシンのMUAでは、エラーは発生しなかったが、
しかし、Postfixのログ、/var/log/maillog を確認 すると、次のエラーが発生して送信に失敗していた。
Postfixは、relayhostとして設定した A.domain.tld:587 へ接続を試みたが、認証に失敗したようだ。
(host A.domain.tld[xxx.xxx.xxx.xxx] said: 530 AUTH first (#5.5.1)


そこで、 relayhost である A.domain.tld:587 へ接続するための認証情報を設定した。



・認証情報を作成した。

次のようにして認証情報を適当な名前のファイルに挿入した。(複数追加可能)
# echo "A.domain.tld:587 account:password" > /etc/postfix/relay_password

作成したファイルをハッシュ化した。
(後で示すように、このファイルを指定するときhashを指定する必要がある。)
# postmap /etc/postfix/relay_password

# ls relay_password.db
relay_password.db

作成したデータベースが正常かを確かめた。
データベースに対して、クエリーを発行し認証情報が記録されているか確認をした。
# postmap -q A.domain.tld:587 /etc/postfix/relay_password
account:password



・main.cf に認証のための設定を追加した。
(エディタでもよいが、ここでは専用のコマンドで設定を行った。)

上記で作成した認証情報データベースを登録した。
# postconf -e smtp_sasl_password_maps=hash:/etc/postfix/relay_password
念のために確認すると、確かに、main.cf に次の設定を見つけられた。
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
# postconf -e smtp_sasl_auth_enable=yes
# postconf -e smtp_sasl_security_options=noanonymous



■上位SMTPサーバへリレーさせる動作テストを行なった

ここまで設定して、service postfix restart を行ってから、
ClientマシンのMUAから、someone@A.domain.tld 宛へメールを送信テストを行った。

これで、上位サーバへリレーされるはずだと期待したが、
Postfixにおいて、次のエラーが発生して、送信に失敗した。
(SASL authentication failed; cannot authenticate to server A.domain.tld[xxx.xxx.xxx.xxx]: no mechanism available)
warning: SASL authentication failure: No worthy mechs found

googleで調べると、
上位SMTPサーバの種類によっては、さらにパッケージの導入が必要であるらしいことがわかった。


■プレインで認証するSMTPサーバにリレーするために必要なパッケージをインストールした

PLAINで認証情報が交換されるSMTP上位サーバとの通信のために必要なパッケージを追加した。
# yum install cyrus-sasl-plain

Name        : cyrus-sasl-plain
Arch        : x86_64
Version     : 2.1.23
Release     : 15.el6_6.2
Size        : 31 k
Repo        : updates
Summary     : PLAIN and LOGIN authentication support for Cyrus SASL
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
License     : BSD
Description : The cyrus-sasl-plain package contains the Cyrus SASL plugins which support
            : PLAIN and LOGIN authentication schemes.

# postconf -e smtp_sasl_mechanism_filter=plain,login


そうして、さらに動作テストを行った。

■結果
ClientのMUAからPostfixへSMTPで送信したメールは、
このPostfixによってさらに上位にあるSMTPサーバーへリレーされて、
冒頭の図式に挙げた、A.domain.tldや、B.domain.tldのメールボックスに到達した。


■結果(Gmaiのメールボックス宛メールの場合)

ただし、gmailのメールボックスに到達したメールはspam判定された。(到達はしていた)
到達したメールのヘッダーには次の二種類のタグがつけられていた。
Received-SPF: none (google.com: 送信元メールアドレス does not designate permitted sender hosts) client-ip=PostfixのグローバルIPv4アドレス
Authentication-Results: mx.google.com;
       spf=none (google.com: 送信元メールアドレス does not designate permitted sender hosts) smtp.mail=送信元メールアドレス

これは、送信メール(のエンベロープ)に指定された送信元メールアドレスに含まれるドメイン  A.domain.tld に対して、
GmailがSPFレコードを検索しようとしたところ、該当するレコードが見つからなかったというエラーである。
上記エラーログには、次のように示されている。
送信元メールアドレス(のドメインA.domain.tld)は、送信用ホストを指定していないという旨である。
送信元メールアドレス does not designate permitted sender hosts

SPFレコードは、メールの送信元ドメインが使用する送信元IPアドレスを予め登録しておくために利用される。
これによって、メールに記載された送信元ドメインと、送信元IPアドレスの関連付けがなされる。
関連付けがSPFレコードによって見つけられなければ、SPAMメールとして判断される場合がある。

回避するには、A.domain.tldにSPFレコードを設定し、
最初に通過したSMTPサーバであるPostfixのグローバルIPv4アドレスを登録する必要があると思われる。



◆フォールバック用SMTPサーバーの登録もしておいたほうが良い。

smtp_fallback_relay = smtp.another-domain.tld:587

これついても同様に、対応するSMTP認証情報を登録しておくこと。

万が一、メインSMTPサーバーとの間に問題が発生しても、フォールバックSMTPサーバーを通じて配送が行われる。



<参考>
・SMTP fallback relay
< https://wiki.zimbra.com/wiki/Smtp_fallback_relay > 2016年2月15日

・Kurztipp: postfix – SASL authentication failure: No worthy mechs found
< http://www.stankowic-development.net/?p=5317 > 2015年5月5日

・SMTP-AUTHを使って上位メールサーバへ転送する
< http://hp.vector.co.jp/authors/VA022911/tec/centos/postfix25.htm > 2015年5月5日

・上位メールサーバへ一律転送するメールサーバ
< http://hp.vector.co.jp/authors/VA022911/tec/centos/postfix2.htm > 2015年5月5日

・Outgoing SMTP Authentication
< https://wiki.zimbra.com/wiki/Outgoing_SMTP_Authentication > 2015年5月5日

・Postfix SASL Howto
< http://www.postfix.org/SASL_README.html#client_sasl_policy > 2015年5月5日

・Postfixで、GMAIL経由でメールを送る(OP25B対策)
< http://blog.f13.jp/post/25843286280/postfix-gmail-op25b > 2015年5月5日

・Postfix でメールリレーの設定 (SMTP クライアント + SMTP Auth)
< http://www.maruko2.com/mw/Postfix_%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%AA%E3%83%AC%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A_%28SMTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88_%2B_SMTP_Auth%29 > 2015年5月5日

・SASL authentication failure: No worthy mechs foundAdd Star
< http://d.hatena.ne.jp/machua/20120301/1330625122 > 2015年5月5日

2015年4月30日木曜日

【Postfix 2.6.6 x86_64】transport設定で正規表現を使う場合について【Linux CentOS 6.5 x86_64】

受信メールを他のプログラムなどに処理させるために、トランスポート設定を行った。
処理対象にする受信メールの送信先アドレスを正規表現をつかってフィルタリングした。


■設定方法

(1)トランスポート処理対象メールの送信先アドレス正規表現とその委託先をmaster.cfファイルに記述した。 

委託先として指定した、test:localhost は、後述のpipe処理用サービスである。

[root@test postfix]# vim /etc/postfix/transport
(省略)
/^test-.*\_0.*@example\.domain\.tld$  test:localhost
(省略)

ところで、別のメールサーバにSMTPで転送するには、次のように記述する。
/^test-.*\_0.*@example\.domain\.tld$  smtp:another-sever.tld:25


(2)上で記述したファイルを、main.cf ファイルに登録した。

<注意>
transportファイルの検索を高速にするためのバイナリ化処理は行わない!
正規表現を利用する場合はテキストファイルのまま使用する。
# /usr/sbin/postmap /etc/postfix/transport

[root@test postfix]# vim /etc/postfix/main.cf
(省略)
#コメントアウト#transport_maps = hash:/etc/postfix/transport
transport_maps = regexp:/etc/postfix/transport
test_destination_recipient_limit = 1
(省略)

(3) マスターファイルに、委託先についてに記述した。

argv= には、パイプ先になる標準入力対応のプログラムとその引数を記述する。
user= には、そのプログラムを実行するLinuxユーザー名を記述する。
$sender や、$mailbox などの変数をつかって情報を取得できる。 (他にもある。)

[root@test postfix]# vim /etc/postfix/master.cf
(省略)
test       unix  -       n       n       -       1       pipe
  flags= user=uucp argv=/etc/testscript.sh testarg1 ${sender} ${mailbox} testarg4
(省略)


(参考)
・How can I route some emails to a script in Postfix?
< http://serverfault.com/questions/322657/how-can-i-route-some-emails-to-a-script-in-postfix > 2015年4月30日

・[debian-users:37348] Re: postfixで正規表現ルックアップテーブル
< http://lists.debian.or.jp/debian-users/200306/msg00121.html > 2015年4月30日

2015年4月16日木曜日

【Linux CentOS 6 bash】 変数の前方後方パターンマッチによる部分消去方法、複数行ファイルのforループによる処理方法について【シェルスクリプト】

変数に保存された文字列を切り取る方法
forループが項目として認識するための区切りを改行コードのみにする方法


(処理でつかうデータ)
次のような行が、20150416.txt に保存されているとする。
20150416_1140_xxx xxx xxxx--anonymous-dat000002954
20150416_1216_-xxx-yyy-dat000002971
20150416_1321_--anonymous-dat000002990
20150416_1431_--anonymous-dat000003011
各行のdat以下の文字列は、拡張子(tif)を除いたファイル名である。


(処理内容)
この記録をつかって、ファイルを検索し別ディレクトリにコピーする。
ただし、ファイル名を一部変更する。

たとえば、
cp dat000002954 /home/test/20150416/20150416_1140.dat
と処理されるようにする。


(処理方法)
次のスクリプトを作成し処理を行った。

#!/bin/bash
IFS_orginal=$IFS
IFS=$'\n'

for k in `cat 20150416.txt`
do
cp ${k##*-}.dat /home/test/20150416/${k%_*}.dat
done

IFS=$IFS_orginal


<解説>
`cat 20150416.txt`でファイルから行を先行して取得する。
取得した複数行に対して、for 変数 in をあてがって、1行ずつ取得する。
毎行の処理は、do~done で行う。 (cpコマンドを実行している。)

ところで、このように、for 変数 in によって、1行ずつ取得するために、
項の区切り文字の設定を、IFS=$'\n' として改行コードにした。
(さもなければ、行中にスペースが存在している場合にその前後で分断されて変数に格納されてしまう。)

この各行処理では、変数kによって行内容を取得している。
処理条件のとおり、各行の最後にあるdat以下の文字列を必要としている。
次のような行の場合、
20150416_1140_xxx xxx xxxx--anonymous-dat000002954
変数kから不要な文字列を切り取ったものを使用すればよい。


○前方一致でパターンにマッチした部位を排除する方法
行の最後に現れる「 - 」以前の文字列を除外するためには、次のようにする。
${k##*-}
前方一致系は「#」記号を用いる。文字列の前方から指定パターンを探してそのマッチ部位を除外する。
この例では、dat000002954 を取り出したい。
そのため、行の前方から見て一番最後に現れる「 - 」を探したいので、「##」を用いる。
「*」ワイルドカードを置くことで、この「 - 」以前の文字列がマッチし、それらが排除される。


○後方一致でパターンにマッチした部位を排除
${k%_*}
後方一致系は「%」記号を用いる。文字列の後方から指定パターンを探してそのマッチ部位を除外する。
この例では、20150416_1140 を取り出したい。
そのため、行の後方から見て一番最初に現れる「 _ 」を探したいので、「%」を用いる。
「*」ワイルドカードを置くことで、この「 _ 」までの文字列がマッチし、それらが排除される。



<参考>
・shとbashでの変数内の文字列置換などAdd Star
 < http://d.hatena.ne.jp/ozuma/20130928/1380380390 >
2015年04月16日

・IFSを変更して区切り文字を改行だけにする
 < http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8D%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E6%96%87%E5%AD%97%E5%88%97%E3%82%921%E8%A1%8C%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%81%86%E6%96%B9%E6%B3%95.html#y44021bd >
2015年04月16日

2015年1月22日木曜日

【Linux CentOS 6.5 64bit】Canonプリンタドライバを更新して新しいプリンタを導入する【cndrvcups 2.90】

新規に導入する場合はこちらを参照してください。
http://akira-arets.blogspot.jp/2013/12/linux-centos65-64bitcanoniplinux-lipslx.html
 

<概要>
キャノンプリンタとドライバをすでに導入しているLinuxシステムに新しいプリンタを追加するとき、
この追加するプリンタに導入済みのドライバが非対応の場合、新しいドライバに更新する必要がある。

以下では、古いキャノンプリンタドライバを新しいプリンタドライバに更新する手順を示している。
手順は、キャノンプリンタの設定を全て削除した後、古いプリンタドライバを削除してから、
新しいプリンタドライバを導入して、再びプリンタの設定を行うようにした。



1、準備と作業前の確認

□ システムの情報を表示させた。

[root@vm ~]# uname -a
Linux vm1 2.6.32-431.17.1.el6.x86_64 #1 SMP Wed May 7 23:32:49 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux


□ 現在すでに導入されて利用可能なプリンタの一覧を取得した。
[root@vm ~]# lpstat -p
プリンター Cups-PDF は待機中です。2014年12月25日 21時31分49秒 以来有効です

プリンター LBP3900-LIPSLX は待機中です。2015年01月14日 16時56分50秒 以来有効です
プリンター LBP5900-LIPSLX は待機中です。2015年01月14日 21時55分52秒 以来有効です
プリンター LBP8610-LIPSLX は待機中です。2014年12月03日 18時11分10秒 以来有効です



2、現在のプリンタ設定の削除と、旧ドライバの削除

■ 上記のCANONの各プリンタ設定を削除した。
[root@vm RPM]# /usr/sbin/lpadmin -x LBP3900-LIPSLX
[root@vm RPM]# /usr/sbin/lpadmin -x LBP5900-LIPSLX
[root@vm RPM]# /usr/sbin/lpadmin -x LBP8610-LIPSLX


□ 削除されたかを確認した。
[root@vm1-cc RPM]# lpstat -p
プリンター Cups-PDF は待機中です。2014年12月25日 21時31分49秒 以来有効です

□ 現在のプリンタドライバのバージョンを表示させた。
[root@vm ~]# rpm -qa | grep cndrv
cndrvcups-lipslx-2.70-1.x86_64
cndrvcups-common-2.70-1.x86_64

■ 古いプリンタドライバの削除を行った。
(削除する順番に注意する。commonは、lipslxに依存されているため。)
[root@vm RPM]# rpm -e cndrvcups-lipslx-2.70-1
[root@vm RPM]# rpm -e cndrvcups-common-2.70-1

□ 削除できたか確認した。
(何も表示されないので削除ができていることがわかった。)
[root@vm RPM]# rpm -qa | grep cndrv



3、新しいプリンタドライバのインストールを行った

□ 新しいプリンタドライバをキャノンのサイトからダウンロードして展開した。
[root@vm canon]# tar -zxvf linux-lipslx-printerdriver64-v290.tar.gz
linux-lipslx-printerdriver64-v290/
linux-lipslx-printerdriver64-v290/64-bit_Driver/
linux-lipslx-printerdriver64-v290/64-bit_Driver/Debian/
linux-lipslx-printerdriver64-v290/64-bit_Driver/Debian/cndrvcups-common_2.90-1_amd64.deb
linux-lipslx-printerdriver64-v290/64-bit_Driver/Debian/cndrvcups-lipslx_2.90-1_amd64.deb
linux-lipslx-printerdriver64-v290/64-bit_Driver/RPM/
linux-lipslx-printerdriver64-v290/64-bit_Driver/RPM/cndrvcups-common-2.90-1.x86_64.rpm
linux-lipslx-printerdriver64-v290/64-bit_Driver/RPM/cndrvcups-lipslx-2.90-1.x86_64.rpm

linux-lipslx-printerdriver64-v290/Documents/
linux-lipslx-printerdriver64-v290/Documents/guide-lipslx-2.9x.tar.gz
linux-lipslx-printerdriver64-v290/Documents/LICENSE-lipslxdrv-2.90.txt
linux-lipslx-printerdriver64-v290/Documents/README-lipslx-2.9x.txt

□ インストールするパッケージのあるディレクトリへ移動して、ファイルの確認をした。
[root@vm RPM]# ls
cndrvcups-common-2.90-1.x86_64.rpm  cndrvcups-lipslx-2.90-1.x86_64.rpm

■ プリンタドライバをインストールした。

(インストール順番に気をつける。)
[root@vm RPM]# rpm -ivh cndrvcups-common-2.90-1.x86_64.rpm
準備中...                ########################################### [100%]
   1:cndrvcups-common       ########################################### [100%]
[root@vm RPM]# rpm -ivh cndrvcups-lipslx-2.90-1.x86_64.rpm
準備中...                ########################################### [100%]
   1:cndrvcups-lipslx       ########################################### [100%]

□ 新しいバージョンがインストール完了したことを確認した。
[root@vm RPM]# rpm -qa | grep cndrv
cndrvcups-common-2.90-1.x86_64
cndrvcups-lipslx-2.90-1.x86_64



4、プリンタを再び導入した。

■ (重要)まず、CUPSを再起動した。
[root@vm RPM]# service cups restart
cups を停止中:                                             [  OK  ]
cups を起動中:                                             [  OK  ]

■ プリンタを登録しなおした。(†1
[root@vm RPM]# /usr/sbin/lpadmin -p LBP5910-LIPSLX -P /usr/share/cups/model/CNCUPSLBP5910ZJ.ppd -v lpd://192.168.100.11 -E

[root@vm RPM]# /usr/sbin/lpadmin -p LBP3900-LIPSLX -P /usr/share/cups/model/CNCUPSLBP3950ZJ.ppd -v lpd://192.168.100.12 -E

[root@vm RPM]# /usr/sbin/lpadmin -p LBP8710-LIPSLX -P /usr/share/cups/model/CNCUPSLBP8720ZJ.ppd -v lpd://192.168.100.13 -E

[root@vm RPM]# /usr/sbin/lpadmin -p iRC2550-LIPSLX -P /usr/share/cups/model/CNCUPSIRC2550ZJ.ppd -v lpd://192.168.100.14 -E

[root@vm RPM]# /usr/sbin/lpadmin -p LBP8610-LIPSLX -P /usr/share/cups/model/CNCUPSLBP8630ZJ.ppd -v lpd://192.168.100.15 -E

[root@vm RPM]# /usr/sbin/lpadmin -p iRADVC2230-LIPSLX -P /usr/share/cups/model/CNCUPSIRADVC2230ZJ.ppd -v lpd://192.168.100.16 -E


□ プリンタの登録状況を確認した。
[root@vm RPM]# lpstat -p
プリンター Cups-PDF は待機中です。2014年12月25日 21時31分49秒 以来有効です
プリンター iRC2550-LIPSLX は待機中です。2015年01月15日 05時06分12秒 以来有効です
プリンター LBP8710-LIPSLX は待機中です。2015年01月15日 05時06分12秒 以来有効です
プリンター LBP3900-LIPSLX は待機中です。2015年01月15日 05時06分11秒 以来有効です
プリンター LBP5910-LIPSLX は待機中です。2015年01月15日 05時06分11秒 以来有効です
プリンター iRADVC2230-LIPSLX は待機中です。2015年01月15日 05時06分14秒 以来有効です
プリンター LBP8610-LIPSLX は待機中です。2015年01月15日 05時06分12秒 以来有効です

以上


<参考>
・【Linux CentOS6.5 64bit版】ネットワーク対応CANONレーザープリンタをIPネットワーク経由で利用するための設定【linux-lipslx-printerdriver64-v270.tar.gz】
< http://akira-arets.blogspot.jp/2013/12/linux-centos65-64bitcanoniplinux-lipslx.html >2015年1月22日

2015年1月6日火曜日

【Linux Raspbian】仮想端末tmuxでprotocol version mismatchエラーの発生原因と対処方法について

■tmux再接続ができなくなる問題発生の経緯

tmuxによる仮想端末上で、apt-get upgrade などのコマンドでシステムをアップデートしたとき、
tmux自体も同時にアップデートされたようだ。

何も考えずに、システムアップデート作業中のこのtmux仮想端末をデタッチした。
しばらくして再び、tmux attach して「仮想端末」にアクセスしようとすると、次のエラーが発生した。

root@raspberrypi:~# tmux attach
protocol version mismatch (client 8, server 6)


■その理由

原因はすぐに予想できた。

システムアップデートでtmuxパッケージが更新された。
このアップデートでも、メモリ上に存在し続けている「tmuxプロセス」自体はアップデートの影響を受けず、古いバージョンのままである。
しかし、tmux仮想端末をデタッチし再びアタッチしようとすると、
アタッチを行うプロセス(client)はパッケージ更新後の新しいバージョンになっている。
新しいバージョンのクライアントから、 古いバージョンのサーバープロセスに接続できないので、さきのエラーとなるのだろう。



■対策

1、まず、現在接続不能になっている古いサーバープロセスの番号を調べる。
root@raspberrypi:~# pgrep tmux
2122
2、次のようにして、調べたプロセス番号を指定し、クライアントとして実行する。
root@raspberrypi:~# /proc/2122/exe attach
[exited]

無事にtmuxセッションへ再接続できた。



■考察

次のように、exeが、tmuxへシンボリックリンクになっていることがわかった。

root@raspberrypi:~# pgrep tmux
28066
root@raspberrypi:~# ls -all  /proc/28066/exe
lrwxrwxrwx 1 root root 0 Jan  6 14:13 /proc/28066/exe -> /usr/bin/tmux

この方法が通じるのは、tmux がサーバーとクライアントで同じ型のプログラムを使っているからだろう。
たぶん、残存しているサーバーの「プロセス」に対して、これと同じプログラムをクライアントとして、接続するわけである。

しかし、 exeは実体ファイルへのシンボリックリンクである。
だから、システムのアップデートでtmuxが更新されれば、
リンクされている実体ファイルは、新しいバージョンに更新されると思う。
したがって、さきの方法「exe attach」で実行されるクライアントプログラムも、
新しいバージョンのものになってしまうだろうと思う。

どうして、さきの方法で、バージョンの不適合エラーを回避できたのかわからない。



<参考>
・Peter Van Eynde Shared publicly  -  May 7, 2013
< https://plus.google.com/110139418387705691470/posts/BebrBSXMkBp > 2015年1月6日

・protocol version mismatch (client 8, server 6) when trying to upgrade
< http://unix.stackexchange.com/questions/122238/protocol-version-mismatch-client-8-server-6-when-trying-to-upgrade > 2015年1月6日

・今週のお題 - /proc/プロセスID を探検する
< http://www.usupi.org/sysad/024.html > 2015年1月6日

・リンクについて
< http://cmd.misty.ne.jp/environment/03.html > 2015年1月6日

投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad