- 投稿日:2019-03-07T21:43:13+09:00
AWSで簡易なSFTPサーバー構築 - SFTPサーバー設定
ec2-userでSSHログイン
rootユーザに変更
$ sudo su -ユーザー作成
# useradd ユーザー名rootユーザーからexit
# exit作成したユーザーに変更
$ sudo su 作成したユーザー名作成したユーザーのホームディレクトリに移動
$ cd /home/作成したユーザー名.sshディレクトリ作成
$ mkdir .ssh.sshディレクトリのパーミッション(権限)を700に変更
$ chmod 700 .ssh.sshの直下にauthorized_keysファイル作成
$ touch .ssh/authorized_keysauthorized_keysファイルのパーミッションを600に変更
$ chmod 600 .ssh/authorized_keys秘密鍵公開鍵の準備
Puttygenで公開鍵のスクリーンをドラッグしてコピー
authorized_keysに公開鍵を貼り付け
cat >> .ssh/authorized_keys入力モードになるので、(Puttyの場合)Shift + insertボタン押下
Enter
:q + Enter
でプロンプトに戻る別のPuttyセッションを立上、作成したユーザー名で作成した秘密鍵でログインできることを確認
sftpコマンドでのみ接続を許可させる
authorized_keysの先頭に下記の記載を追加し、改行を入れる。
/home/[user_dir]/.ssh/authorized_keys
command="internal-sftp"
あとはこちらの記事を参考にできました。ありがとうございます。
- 投稿日:2019-03-07T21:00:54+09:00
AWSで簡易なSFTPサーバー構築 - 初期設定
AWSに簡易なSFTPサーバーを立てようとして何度も失敗したので、正しい手順を記録化する話
EC2インスタンスを立てる
立てる過程でKey pair作成
AWSコンソールで、秘密鍵をダウンロード
ローカルマシンにPuttyとPuttygenをインストール
PuttygenでConversionメニューからImport Key. ダウンロードした秘密鍵ファイル.pemを選択。Save private keyで、open-ssh形式の秘密鍵ファイル.ppkを保存
Puttyにセッション作成
AWSコンソールにて対象インスタンスに接続ボタンを押すと表示されるパブリックDNSが接続先DNS
Authに上で作ったOpen SSH形式の秘密鍵.ppkを設定Open押下でSSHログイン
初期はec2-userであり、rootではない
yum アップデート
$ sudo yum update -ygitをインストール
'''
$ sudo yum -y install git
'''Python3をインストール
$ sudo yum install python3Pyenvのインストール
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenvPathを通す
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile $ source ~/.bash_profileコマンドが通るか確認
$ pyenv -v必要な依存関係のインストール
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -ypython3.7の場合は以下も必要
sudo yum install libffi-develpythonのインストール
pyenv install 3.7.1バージョンの切替
$ pyenv global 3.7.1 $ pyenv rehash確認
$ python --version3.7.1になっていれば成功
- 投稿日:2019-03-07T20:50:58+09:00
デバイスファイルのシンボリックリンク作成方法
USB仕様の力センサを2個使いたい時に右と左でそれぞれ個別に認識する方法。
デバイスにはidVendorやserialが割り当てられているので、それらに関する設定を書く。
# FFS055YA501U6 SN: 1803043
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="1803043", SYMLINK+="fss055ya0"# FFS055YA501U6 SN: 1803044
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="1803044", SYMLINK+="fss055ya1"それぞれのATTRSは
udevadm info -a -n /dev/ttyACM0 | grep idVensor
といったようにATTRS{}の{}の中身でgrepして調べる。
- 投稿日:2019-03-07T20:33:02+09:00
Azure WebApps(Linux)で特定ディレクトリをアクセス制限する
Azure WebAppsはデフォルトでアクセス制限機能を持っています。
頻繁にメニューが変更されるのでここだと特定しにくいのですが、2019/03/07時点では『設定』→『ネットワーク』→『アクセス制限』から指定可能です。しかし、これはサイト全体へのアクセス制限です。
そうではなく、特定のディレクトリだけ制限したい、要するに
.htaccessでRequire ipって書きたいんじゃという情報が全然見当たらなかったので調べたけどいまいちわからなかったメモ。
そもそもLinux版WebAppsの情報自体少ない。目的
特定のディレクトリだけ、指定したIPアドレス以外からは接続不可にしたい。
ちなみに
Order deny,allowはもはや古い書き方なので、今後は使わないようにしましょう。試してみる
.htaccessRequire ip 8.8.8.8普通のサーバであれば、これでIPアドレス8.8.8.8からの接続は許可、それ以外は拒否されます。
が、WebAppでこう書くと、Allowしたつもりのホストからの接続も拒否されます。
何故かというと、WebAppsのサーバに辿り着く前にREMOTE_ADDRが書き換えられています。
REMOTE_ADDRには本来はクライアントのIPアドレスが入ってくるのですが、WebApp上では172.16.0.1のようなローカルアドレスに書き換えられていました。
元々のIPアドレスはHTTP_X_CLIENT_IPに入っていました。ということで、接続元IPアドレスとしてHTTP_X_CLIENT_IPを見るようにすれば解決するでしょう。
.htaccessRequire env HTTP_X_CLIENT_IP 8.8.8.8動きませんでした。
どうやら
Require envは環境変数が存在するかどうかしか見ないようです。
従って、一度SetEnvIfで一時変数を作る必要があるみたいです。.htaccessSetEnvIf HTTP_X_CLIENT_IP "8.8.8.8" valid_ip Require env valid_ipこっちも動かない。
SetEnvIfの引数には一部の環境変数しか指定できないみたいです。
なんで。解決方法
.htaccessRequire expr http('X-CLIENT-IP') -ipmatch '8.8.8.8'わかんねーよハゲ。
このhttpとかipmatchとかは公式マニュアルに全く書かれておらず、正規表現の項目にあります。
というか何故変数名がアンダーバーとかハイフンとかCamelCaseとかバラバラなのだ。あと、この例だと環境変数の頭の
HTTP-が勝手に消えるんだけど、HTTP-から始まらない、たとえばSERVER-ADDRあたりを引っかけたい場合はどうすればいいんだろう。
試しにRequire expr req_novary('REQUEST-METHOD') -strmatch 'GET'とか書いてみても動かなかった。
%構文が使えない正規表現の例では、
.htaccess<If "%{HTTP_HOST} == 'example.com'"> Require all denied </If>のような例が載っています。
このように、一部の環境変数は%{HOGE}で取得できます。しかしHTTP_X_CLIENT_IPを使おうとするとInternal Server Errorになります。
.htaccess<If "%{HTTP_X_CLIENT_IP} != '8.8.8.8'"> Require all denied </If>
%構文はSERVER_PROTOCOLやHTTP_USER_AGENTやQUERY_STRINGやHTTP_COOKIEには使用可能。
SERVER_SIGNATUREやHTTP_CONNECTIONやHTTP_X_CLIENT_IPやPHP_SELFには使用不可。PHP_SELFはともかく、他の使える環境変数と使えない環境変数の違いがわからない。
htaccessに来た時点では定義されてない値とかだろうか。
この違いは何処を見ればわかるのだろう。
- 投稿日:2019-03-07T20:15:15+09:00
httpd.conf中身構成
おはようございます、こんにちわ、こんばんわ
勉強したこと、連携します。何かの役に立てば幸いです
1.設定ファイル(/etc/httpd/conf/httpd.conf)の基本
Apache の設定ファイルは、/etc/httpd/conf/httpd.conf です。この設定ファイルは、大きく 3 つのセクションに分けてディレクティブ(設定項目)が記述されています
セクション壱:Global Environment
Apache サーバープロセスの全般的な制御(グローバルな設定)を行うためのディレクティブを指定する
セクション弐:'Main' server configuration
バーチャルホストでないメインサーバーの設定を行うためのディレクティブを指定する。ここで指定した値は、バーチャルホストの初期値として反映されます。バーチャルホストとは物理的に一台のコンピュータで複数の Web サイトを公開するための機能です
セクション参:Virtual Hosts
各バーチャルホスト毎の設定を行うためのディレクティブを指定する
以上です!!
- 投稿日:2019-03-07T18:59:48+09:00
CentOS 6にTorqueをセットアップ
CentOS 6にTorqueをセットアップする際のメモ
計算サーバは1台でヘッドノード兼用とする。
http://www.fiatlux.co.jp/faq/build/html/MFmyPresto_Other_Torque.html
の方法でもいいが、ソースビルドしたくないのでyumを使う。ホスト名が設定されているか
$ hostnameで確認する。
※localhost.localdomainではダメ
※ホスト名が数字から始まっているとダメホスト名からIPアドレスが引けないと問題になるので、予め設定しておいたほうが良い。
IPアドレス: 192.168.0.10
ホスト名: HostA
の場合、/etc/hostsに192.168.0.10 HostAを追加する。
※ループバックアドレス(127.0.0.1)ではダメ# yum install -y epel-release # yum install -y torque-client torque-mom torque-server torque-scheduler # create-munge-key # pbs_server -t create -f -D & # pbs_server_pid=$! # kill $pbs_server_pid # echo "$HOSTNAME np=$(nproc) num_node_boards=1 numa_board_str=$(nproc)" > /var/lib/torque/server_priv/nodes # hostname > /etc/torque/server_name # echo "nodes=0" > /var/lib/torque/mom_priv/mom.layout/var/lib/torque/mom_priv/configが
$pbsserver localhostになっていたので、
$pbsserver HostAに変更。
# service munge start # service pbs_server start # service trqauthd start # service pbs_sched start # service pbs_mom start # chkconfig munge on # chkconfig pbs_server on # chkconfig trqauthd on # chkconfig pbs_sched on # chkconfig pbs_mom on下記コマンドでキューL0を設定する。
キュー名は別の名前でも良い。# qmgr -c "create queue L0 queue_type=execution" # qmgr -c "set queue L0 started=true" # qmgr -c "set queue L0 enabled=true" # qmgr -c "set queue L0 resources_default.nodes=1" # qmgr -c "set queue L0 resources_default.walltime=3600"![undefined]() # qmgr -c "set server default_queue=L0" # qmgr -c "set server scheduling=true" # qmgr -c 'p s'で設定内容を確認する。
# pbsnodes -astate = free
になっていることを確認。
hostname等設定以降のスクリプト例
#!/bin/bash set -x yum install -y epel-release yum install -y torque-client torque-mom torque-server torque-scheduler create-munge-key pbs_server -t create -f -D & sleep 10 pbs_server_pid=$! kill $pbs_server_pid echo "$HOSTNAME np=$(nproc) num_node_boards=1 numa_board_str=$(nproc)" > /var/lib/torque/server_priv/nodes hostname > /etc/torque/server_name echo "nodes=0" > /var/lib/torque/mom_priv/mom.layout sed -i.bak s/localhost/`hostname`/g /var/lib/torque/mom_priv/config service munge start service pbs_server start service trqauthd start service pbs_sched start service pbs_mom start chkconfig munge on chkconfig pbs_server on chkconfig trqauthd on chkconfig pbs_sched on chkconfig pbs_mom on qmgr -c "create queue L0 queue_type=execution" qmgr -c "set queue L0 started=true" qmgr -c "set queue L0 enabled=true" qmgr -c "set queue L0 resources_default.nodes=1" qmgr -c "set queue L0 resources_default.walltime=3600" qmgr -c "set server default_queue=L0" qmgr -c "set server scheduling=true" qmgr -c 'p s' pbsnodes -a
- 投稿日:2019-03-07T15:21:45+09:00
[ROS自動起動] robot_upstart vs 自分で書く
はじめに
ロボット制御ROSを自動起動する必要があり、ROSパッケージのrobot_upstartと
ROSを自動起動するを参考に自分で書く、2パターンでトライしてみましたのでそのメモです。
結論としては、使うデバイスやLaunchファイルの数が少ないシンプルな構成の時はrobot_upstart、デバイスやPermissionが複雑な構成の時は自分で書いた方が幸せになれるように思います。環境
- Ubuntu 18.04 (JetPack 4.1.1 Developer Preview)
- ROS Melodic Morenia
- Jetson AGX Xavier
比較
どちらも、実施していることはサービスの作成です。なので、robot_upstart特有のトレードオフというよりは「ツールを使うか自作するか」という種の問題に一般的な長所短所があります。
長所 短所 robot_upstart - 導入と使用方法が簡便
- Linux特有の知識はほぼ不要- 自動化されすぎててデバッグが面倒 自分で書く - 柔軟性が高い
- デバッグが容易- Linux (Ubuntu)の知識がある程度必要 robot_upstartを使ってみた
robot_upstartの導入は簡単です。わずか一行。sudo apt-get install ros-<distro>-robot-upstart次に、自動で起動させたいlaunch fileを登録します。これも簡単。
rosrun robot_upstart install <your_package_name>/launch/<your_launch_file>.launchこれだけで、次回起動時には登録したlaunchファイルが起動するようになります。
robot_upstartのつまづきポイント
ログの出力先がドキュメントと異なる。
たぶんドキュメントが更新されてないだけだと思いますが、私の環境ではドキュメントに書いてある
/var/log/upstartではなく/var/log/syslogに出力されていました。環境変数の設定
setuidgidで直接roslaunchを叩いているためか.bash_profileや.bashrcが読み込まれないので、必要な環境変数が無かったり意図しない値になってたりすることがあります。
こちらにあるように、必要な設定を書いた.robotrcなどの適当なファイルを作って/opt/ros/<distro>/setup.bashや<your_catkin_ws>/devel/setup.bashからsource path/to/your/fileしてあげるのが良いようです。【参考】
ログインシェルとインタラクティブシェルと~/.bashrc達の関係
How to reference environmental variables inside an upstart installed launch fileCUDAがエラーになる(未解決)
CPUオンリーのノード群は問題なく上記の設定で動いたのですが、私の環境ではCUDAを使っているノードがエラーでコケてしまい立ち上がりませんでした。
おそらく何かのPermissionが適切に設定されてないためだと思うのですが、未解決です。自分で書いてみた
一見とっつきづらいですが、ROSを自動起動するを参考に書いていくと意外と簡単に書けました。
非常にわかりやすい記事を書いてくださった@strv様に感謝です。robot_upstartで直面したCUDAエラーもこちらでは発生しなかったので、私は現在こちらを使用しています。
自分で書いた場合のつまづきポイント
デバイスをsystemdで利用可能にする
systemdで利用可能なデバイス名については、
systemctl --t device -a --full
で確認することが出来ます。とありますが、デバイスによってはデフォルトのままだとこのリストに出てこないことがあります。
そういう時は、該当するデバイスのudevルールにTAG+="systemd"を追加してあげましょう。
既存のルールが無い場合は自分で作成しても大丈夫です。私の場合は下記のようなudevルールを用意しました。SUBSYSTEM=="hidraw", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", TAG+="systemd", SYMLINK+="sensor_device%n", MODE="0666"【参考】
Raspberry Pi 2 + systemd + udevで、USBデバイス挿入時にサービスを起動する、Linux でデバイスを接続している時だけ動くサービスを作る)roscoreの検出
元記事だと
ExecStartPre=/bin/bash -l -c 'rostopic list'でroscoreの検出を行っていますが、このやり方だとrostopic listが失敗した時点でサービス自体が落ちるので、後ろに書いてあるRestart=alwaysとの合わせ技で成立しています。ExecStartPre=/bin/bash -l -c 'rostopic list' <中略> Restart=always元々の方針として
Restart=alwaysであるlaunchファイルならこのやり方が良いと思いますが、私の場合は多数のデバイスが絡むlaunchファイルになっていて頻繁に再起動するような仕様にしたくなかったのでRestart=noにしています。
この場合rostopic listでのroscore検出が出来ないので、元記事のコメントにあるようにroslaunch --waitオプションで待ってあげる必要があります。ExecStart=/usr/bin/screen -S mavros -ADm bash -l -c 'roslaunch --wait mavros px4.launch'
- 投稿日:2019-03-07T12:59:17+09:00
かゆいところに・・・
- 投稿日:2019-03-07T09:58:20+09:00
systemctl メモ
サービスの一覧を確認、起動、停止する手順のメモ
定義されているサービスを全て確認
systemctl list-unit-files --type=service起動中のサービスを全て確認
systemctl list-units --type=service特定のサービスのステータスを確認
systemctl status [サービス名]サービスを起動する
systemctl start [サービス名]サービスを停止する
systemctl stop [サービス名]サービスの自動起動を有効にする
systemctl enable [サービス名]サービスの自動起動を無効にする
systemctl disable [サービス名]