[ssh] config 파일에 IP와 Hostname을 함께 지정

~/.ssh/config 파일 안에 hostname을 지정한다면, 그 뒤에 IP 주소를 함께 지정하면 hostname이나 IP 둘 중 어느 하나로 접속해도 같은 설정이 적용된다. 항목을 여러개 만들 필요 없다. 공백으로 구분하면 다 같이 적용된다. 예를 들면 다음과 같다.

Host nas.dasomoli.org 112.145.250.152 192.168.0.204
    HostName nas.dasomoli.org
    User dasomoli
    Port 2048
    IdentityFile ~/.ssh/id_rsa_dasomoli_nas

랜덤 암호를 생성하는 여러가지 방법

1. OpenSSL을 이용한 랜덤 암호 생성

openssl rand -base64 16
  • 16바이트 길이의 랜덤 데이터를 Base64로 인코딩하여 출력함.
  • 특수 문자 없이 알파벳과 숫자로 구성됨.

2. pwgen 패키지 사용 (설치 필요)

brew install pwgen  # 먼저 설치
pwgen -s 16 1
  • -s 옵션은 강력한 암호를 생성함.
  • 16은 길이, 1은 개수.

3. LC_ALL=C tr을 이용한 무작위 문자열 생성

LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^&*()-_+=' < /dev/urandom | head -c 16
  • /dev/urandom에서 무작위 데이터를 가져와 원하는 문자만 필터링함.
  • head -c 16으로 16글자만 출력.

4. uuidgen을 활용한 암호 생성

uuidgen | tr -d '-' | head -c 16
  • uuidgen으로 UUID 생성 후 하이픈을 제거하고 앞에서 16자만 출력함.

[MacOS] 파인더에서 숨김 파일 보기

파인더에서 다음 단축키를 누른다.
Command (⌘) + Shift (⇧) + . (마침표)

영구적으로 적용하고 싶다면 다음을 실행한다.

defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder

다시 되돌리고 싶다면 다음을 실행한다.

defaults write com.apple.finder AppleShowAllFiles -bool false
killall Finder

[Ethereum] 우분투에 node 설치

execution layer client로 geth를, consensus layer client로 Prysm을 사용한다.

geth 설치

sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt update
sudo apt install -y geth

확인

geth version

부팅 시 자동 실행

sudo vi /etc/systemd/system/geth.service

[Unit]
Description=Ethereum Geth Node
After=network.target

[Service]
Type=simple
User=dasomoli
ExecStart=/usr/bin/geth --mainnet --syncmode "snap" --datadir "/home/dasomoli/geth/data" --http --http.api web3,eth,txpool --http.addr 0.0.0.0
Restart=always
RestartSec=5
LimitNOFILE=8192

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start geth
sudo systemctl enable geth
sudo systemctl status geth

위에서는 “snap” 방식을 사용했다. sync mode로 “full”도 가능.

도메인을 연결한다면 설정에 다음 설정을 포함해야 한다.

	--http.corsdomain "*" \
	--http.vhosts "*"

IPC로 geth console 연결

geth attach ipc:/home/dasomoli/geth/data/geth.ipc

로그 확인

journalctl -u geth -f

Prysm 설치

mkdir prysm
cd prysm/
sudo apt update
sudo apt install -y wget
wget <https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh>
chmod +x prysm.sh

부팅 시 자동 실행

sudo vi /etc/systemd/system/prysm-beacon.service

[Unit]
Description=Prysm Beacon Chain Client
After=network.target

[Service]
Type=simple
User=dasomoli
ExecStart=/home/dasomoli/prysm/prysm.sh beacon-chain \
    --execution-endpoint=http://localhost:8551 \
    --datadir=/home/dasomoli/prysm/data \
    --jwt-secret=/home/dasomoli/geth/data/geth/jwtsecret \
    --accept-terms-of-use \
    --mainnet \
    --checkpoint-sync-url=https://beaconstate.info --genesis-beacon-api-url=https://beaconstate.info
Restart=always
RestartSec=5
LimitNOFILE=8192

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start prysm-beacon
sudo systemctl enable prysm-beacon
sudo systemctl status prysm-beacon

로그 확인

journalctl -u prysm-beacon -f

[git] send-pack: unexpected disconnect while reading sideband packet 에러 발생 시

git push 를 했을 때, 내용이 많은 경우 다음과 같은 에러가 날 때가 있다.

error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
send-pack: unexpected disconnect while reading sideband packet

이 경우, http.postBuffer를 다음과 같이 늘려준다. 아래는 150MB.

git config --global http.postBuffer 157286400

참고: https://stackoverflow.com/questions/66366582/github-unexpected-disconnect-while-reading-sideband-packet

[matplotlib] 한글 폰트 설정

apt-get install -y fonts-nanum
fc-cache -fv
rm ~/.cache/matplotlib -rf

혹은 Windows에서는

from matplotlib import font_manager, rc
font_path = 'C:/Windows/Fonts/NGULIM.TTF'
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)

[jq] 쉘에서의 JSON 처리: jq 사용법

맥에서 설치는 다음과 같다. 우분투는 아마도 apt-get install 을 사용할 것이다.

$ brew install jq

사용법은 값을 얻고 싶은 필드 키를 주면 된다. 뒤에 입력 파일 이름을 주지 않으면 stdin을 입력으로 받는다.

jq “.key” [intput filename]

따라서 curl 이나 echo, cat 등으로 출력을 파이프로 넘겨서 stdin 입력으로 jq에 넘겨서 원하는 데이터를 얻으면 된다. 예를 들어 다음과 같은 데이터를 curl을 통해 얻었다고 하자.

$ curl -X POST "https://login.dasomoli.org/login/2fa" -H "accept: application/json;charset=UTF-8" -H "X-AUTH-MOBILE: true" -H "Content-Type: application/json;charset=UTF-8" -d "{ \"otpCode\": \"123456\", \"password\": \"PASSWORD\", \"userId\": \"dasomoli\"}"
{
  "resultCode": "success",
  "resultMessage": "Successful",
  "data": {
    "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJqdXN0aW55IiwiaW5mbyI6eyJ1c2VySWQiOiJqdXN0aW55IiwibmFtZSI6Ikp1c3RpbiIsImFjY291bnQiOiIweEY2NTUwZTk4ZTVDZUFiRjVkRmQ4NTcxYzY3MGI1Zjg0M0U4OTMzNzAiLCJzeW1ib2wiOiJLU1RBX0RFViIsImVtYWlsIjoianVzdGluLnlhbmdAY3J5cHRlZC5jby5rciIsImxvZ2luVGltZSI6MH0sInJvbGVzIjoiUk9MRV9VU0VSIiwiaWF0IjoxNjk3NDQxMTY3LCJleHAiOjE2OTc0NDQ3Njd9.XVT7RIKybB0hgYzcJvZx9voGlolza83RrxuCsK0i-vo",
    "refreshToken": "eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2OTc0NDExNjcsImV4cCI6MTY5ODA0NTk2N30.auHUC75qf-Xz--e8JAKvtosaYnUB_Hx5-RKTUZyC-ZM"
  }
}

여기서 data 안에 있는 accessToken 값을 얻고 싶다면, 다음과 같이 하면 된다.

$ curl -X POST "https://login.dasomoli.org/login/2fa" -H "accept: application/json;charset=UTF-8" -H "X-AUTH-MOBILE: true" -H "Content-Type: application/json;charset=UTF-8" -d "{ \"otpCode\": \"123456\", \"password\": \"PASSWORD\", \"userId\": \"dasomoli\"}" | jq ".data.accessToken"

쉘 스크립트 내에서 위의 값을 ACCESS_TOKEN 이라는 변수에 넣었을 때, 앞 뒤로 붙는 ” 문자를 없애고 싶다면 다음과 같이 한다.

ACCESS_TOKEN="${ACCESS_TOKEN//\"/}"

[hardhat] hardhat network에서 다른 계정인 척 쓰기

const hwwallet = "0xda50da50da50da50da50da50da50da50da50da50";

//  impersonating HW wallet
await network.provider.request({
  method: "hardhat_impersonateAccount",
  params: [hwwallet],
});

const _master = await ethers.getSigner(hwwallet);
_master.getFeeData = async () => {
  return {
    gasPrice: ethers.BigNumber.from(0),
    lastBaseFeePerGas: ethers.BigNumber.from(0),
    maxFeePerGas: ethers.utils.parseUnits("800", "gwei"),
    maxPriorityFeePerGas: ethers.utils.parseUnits("800", "gwei"),
  };
};
master = _master;

console.log('master: ', await master.getAddress());