コンテンツへスキップ

最近LXCばかり触っていたのでホストからゲストOSを設定できるスクリプトをかいてみた。
ネットワークとSSH公開鍵認証の設定。sshは内容軽くいじれば他でも使いまわせそう。
OSはcentos7.9を想定

#network config
rm /var/lib/lxc/$1/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0
lxc-attach -n $1 -- bash -c 'echo "DEVICE=eth0" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 -- bash -c 'echo "BOOTPROTO=none" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 -- bash -c 'echo "ONBOOT=yes" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 -- bash -c 'echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 -- bash -c 'echo "TYPE=Ethernet" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 -- bash -c 'echo "IPADDR='$1'" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 -- bash -c 'echo "NETMASK='$2'" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 -- bash -c 'echo "GATEWAY='$3'" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 -- bash -c 'echo "DNS1=8.8.8.8" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 -- bash -c 'echo "DNS1=8.8.4.4" >> /etc/sysconfig/network-scripts/ifcfg-eth0'
lxc-attach -n $1 systemctl restart network
#ssh config
lxc-attach -n $1 -- yum -y install openssh-server
lxc-attach -n $1 -- ssh-keygen -N "" -f ~/.ssh/id_rsa
lxc-attach -n $1 mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
lxc-attach -n $1 chmod 600  ~/.ssh/authorized_keys
lxc-attach -n $1 -- sed -i 's/^PubkeyAuthentication.*$/PubkeyAuthentication yes/' /etc/ssh/sshd_config
lxc-attach -n $1 -- sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
lxc-attach -n $1 systemctl restart sshd
lxc-attach -n $1 cat ~/.ssh/id_rsa

個人的に下記行の引数を展開できないことに苦労した。
lxc-attach -n $1 -- bash -c 'echo "IPADDR='$1'" >> /etc/sysconfig/network-scripts/ifcfg-eth0'

シングルクォーテーションって強制的にすべて文字列にするものだと思ってるから
echo以降は全て文字列しかできない。
でもぐぐったら、むしろ$1の場所をシングルクォーテーションでさらに囲ったら変数扱いとなった。
なぜ


参考
sed-iについて
https://www.usupi.org/sysad/197.html

lxc-attachについて
https://gihyo.jp/admin/serial/01/linux_containers/0008?page=4

誰かにcpコマンドの使い方の練習環境を用意するためにとりあえず
とあるサーバー内で勉強用ディレクトリをつくる。

一人ならそれでいいけど複数人に対応する場合、人数分のディレクトリをこちらが用意するのは手間なので
スクリプトを書いてみた。

#!/bin/bash
count=`find /root/study/cp/  -maxdepth 1 -name "player*" |wc -l`

if [ "$count" -eq 0 ]; then
  echo "ディレクトリ名 "player"を作成します"
  mkdir player
  cd ./player
  mkdir cp1 cp2
  cd ./cp1
  touch test{1..10}
  cd ../
  echo rm -rf cp* > reset.sh
  echo mkdir cp1 cp2 >> reset.sh
  echo cd ./cp1  >> reset.sh
  echo 'touch test{1..10}' >> reset.sh
  chmod 700 reset.sh
else
  echo "ディレクトリ名 "player"`expr $count + 1`を作成します"
  mkdir player`expr $count + 1`
  cd ./player`expr $count + 1`
  mkdir cp1 cp2
  cd ./cp1
  touch test{1..10}
  cd ../
  echo rm -rf cp* > reset.sh
  echo mkdir cp1 cp2 >> reset.sh
  echo cd ./cp1  >> reset.sh
  echo 'touch test{1..10}' >> reset.sh
  chmod 700 reset.sh
fi

挑戦したことはスクリプト内でディレクトリ作ったり移動したりファイルを作ったりすること。ほぼ全部だな。
練習中に何度も失敗してもいいようにreset.shを用意してみた。
echoで一行ずつファイルに内容を入れたけど、もっとスマートにやる方法があるなら知りたい。

その他
gitを触ってみてcui上で今回のスクリプトをgithubに
pushしてみたけどまだ慣れてないからちょくちょくgitを触ってみたい。

追記 6月7日
記述に似ている部分があったので関数を作ってみた。よりスマート

#!/bin/bash
count=`find /root/study/cp/  -maxdepth 1 -name "player*" |wc -l`
mkreset (){
     mkdir ${1}1 ${1}2
      cd ./${1}1
      touch test{1..10}
      cd ../
      echo rm -rf ${1}* > reset.sh
      echo mkdir ${1}1 ${1}2 >> reset.sh
      echo cd ./${1}1  >> reset.sh
      echo 'touch test{1..10}' >> reset.sh
      chmod 700 reset.sh
   }

if [ "$count" -eq 0 ]; then
  echo "ディレクトリ名 "player"を作成します"
  mkdir player
  cd ./player
mkreset "cp"
else
  echo "ディレクトリ名 "player"`expr $count + 1`を作成します"
  mkdir player`expr $count + 1`
  cd ./player`expr $count + 1`
mkreset "cp"
fi