레이블이 bash인 게시물을 표시합니다. 모든 게시물 표시
레이블이 bash인 게시물을 표시합니다. 모든 게시물 표시

ssh 로그인 후 바로 종료 문제

# k8s pod 내에 sshd -D 를 기동 후
# 다음과 같이 ssh 연결을 하면 바로 연결이 close 된다.
ssh root@localhost -vvv

... 생략 ...
Last login: Sat Apr 29 07:38:26 2023 from 127.0.0.1
debug3: receive packet: type 96
debug2: channel 0: rcvd eof
... 생략 ...
Connection to localhost closed.
debug1: Exit status 255

# receive packet : type 96(SSH_MSG_CHANNEL_EOF)으로
# 보통 연결된 ssh 에서 exit/logout 하면 받는 패킷이다.

# lastlog(/var/log/lastlog) 로 마지막 로그를 봐도 로그인 된 흔적이 있다.
Username         Port     From             Latest
root             pts/3    127.0.0.1        Sat Apr 29 07:38:28 +0000 2023
... 생략 ...

# lastb(/var/log/btmp)로 실패한 로그인 기록은 보면 없다고 나오고
# last(/var/log/wtmp) | head -2 로 성공한 로그인 기록을 보면 내역에도 기록 되어 있다.
# 그런데 로그인 후 바로 로그아웃되었다.
root     pts/3        127.0.0.1        Sat Apr 29 07:38 - 07:38  (00:00)
root     pts/3        127.0.0.1        Sat Apr 29 07:38 - 07:38  (00:00)

# 혹시 root 기본 쉘을 확인해보면 bash 정상
cat /etc/passwd | grep groot
root:x:0:0:root:/root:/bin/bash

# ssh closed 시 verbose 내용에 255 종료상태가 있는것을 보고 
# 체크1
# 로그인시 ~/.profile, ~/.bashrc 를 rename 으로 로딩을 하지 않아도 closed 된다.

# 체크2
# root/.ssh/ 에 있는 environment 파일이 다른 정상 container 와 달리 꽤 커서 살펴봤다.
# pod(container)의 파일을 로컬로 복사
kubectl cp {namespace}/{pod_name_ssh_접속정상}:/root/.ssh/environment ./environment1
kubectl cp {namespace}/{pod_name_ssh_접속문제}:/root/.ssh/environment ./environment2

# environment1 파일은 500라인인데, environment2 파일은 1000라인이다.
# 문제가 있는 container /root/.ssh/environment 의 내용을 라인을 지워가면서 접속 여부를 확인해봤다.
# 확인결과 environment 내용에 상관없이 라인수를 991로 줄이면 접속이 성공한다.
# 접속시 너무 많은 environment 설정(현재 client 와 중복도 많이 되고 있었음) 문제였음...

github action ubuntu sh syntax error

# github action 중 다음 스크립트를 실행하는데
- name: build script
  run: |
    echo "execute script..."
    sh ysoftman.sh lemon

# ysoftman.sh 내용
if [[ ${1} == "lemon" ]]; then
    echo "ok"
else
    echo "no"
fi

# 원하는 결과가 나오지 않아 action 로그를 보니 다음과 같이 syntax 에러가 찍혀 있었다.
ysoftman.sh: 1: [[: not found

# 원인은 ubutun 위에서 action 이 실행되고 있었고,
# ubuntun 에서 sh -> /bin/dash 로 /bin/bash 문법과 호환되지 않아서다.
# 해결을 위해 /bin/bash 로 실행~
/bin/bash ysoftman.sh lemon

zsh Parameter Expansion Flags

#!/bin/bash
#!/bin/zsh

# 다음과 같은 스크립트가 있을때
a="a
b
c
d e f"

cnt=0
for i in $a; do
    ((cnt++))
    echo "[cnt:$cnt] $i"
done

# bash 로 실행하면 newline, space 로 구분해 다음과 같은 결과를 얻을 수 있다.
# bash ./parameter_expansion_flags.zsh
# [cnt:1] a
# [cnt:2] b
# [cnt:3] c
# [cnt:4] d
# [cnt:5] e
# [cnt:6] f

# zsh ./parameter_expansion_flags.zsh
# zsh newline 으로 구분하지 않아 loop 가 한번만 실행되고 다음과 같이 하나로 출력 된다.
# [cnt:1] a
# b
# c
# d e f
echo "-----"

# 다음과 같이 Parameter Expansion Flags 중 f 를 명시해야 된다.
# f : Split the result of the expansion at newlines. This is a shorthand for ‘ps:\n:’.
# zsh 에선 동작하지만 bash 에서는 에러가 발생한다.
cnt=0
for i in ${(f)a}; do
    ((cnt++))
    echo "[cnt:$cnt] $i"
done

echo "-----"

# 다음과 같이 for 에서 사용하면 bash, zsh 모두 사용할 수 있다.
for i in $(echo $a); do
    ((cnt++))
    echo "[cnt:$cnt] $i"
done

ls dot file with glob, create/delete dash file

# .(dot, hidden) 파일을 *(glob) 으로 bak 으로 끝나는 파일을 조회시
# 다음과 같이 하면 조회가 안된다.
ls *bak
zsh: no matches found: *bak
# 모든 파일 보기 옵션인 -a 옵션을 사용해도 glob 으로는 안된다.
ls -a *bak
zsh: no matches found: *bak

# . 파일을 glob 으로 조회할때면 다음과 같이 . 으로 시작한 후 glob 을 사용해야 한다.
ls .*bak
exa .*bak
lsd .*bak

#####

# dash('-') 로 시작하는 파일명 생성
# -- 이후부터는 - 옵션이 없음
touch -- '-a -b -c'

# 또는
touch ./'-a -b -c'

# - 로 시작하는 파일명 삭제
rm -- '-a -b -c'

# 또는
rm ./'-a -b -c'

k8s configmap 내용 즉시 적용

# kubernetes(k8s) configmap 으로 값을 쓰면 실제 pod 에 전달(적용)까지
# 시간이 좀 걸리는 것 같아 찾아보니

`
As a result, the total delay from the moment when the ConfigMap is updated to the moment when new keys are projected to the pod can be as long as kubelet sync period (1 minute by default) + ttl of ConfigMaps cache (1 minute by default) in kubelet. You can trigger an immediate refresh by updating one of the pod's annotations.
`

# 적용까지 1분+1분(캐시) 걸리 수 있는데,... pod annotation 업데이트하면 pod 에 바로 반영되는것 같다.

# 실제 configmap 적용 후 바로 다음과 같이 refresh 를 위해 pod annotation 을 업데이트하니 바로 pod 에 적용된다.
# 계속 사용해야 하니 유닉스타임(초)와 같은 타임스탬프값을 사용하면 좋을 것 같다.
kubectl annotate --overwrite pods $(kubectl get pods | grep ysoftman | awk '{print $1}') updated="$(date +%s)"



mac builtin command manual page

# mac 환경에서 cd, alias, if 등의 builtin command 의
# manual-page(man page) 는 표시되지 않는다.
# 다음과 같이 cd 명령 설명을 보려고 하면
builtin 에 대략적인 설명 문서만 보인다.
man cd

# bash 를 사용한다면 help 로 설명서를 볼 수 있다.
help cd

# zsh 에는 help 를 사용할 수 없고, run-help 를 사용해야 하는데
# run-help=man 으로 alias 되어 있다.
# run-help alias 를 풀어주고(alias 안되어 있을 수도 있어 stderr null 처리)
unalias run-help 2> /dev/null

# zsh 의 autoloading function 으로 run-help 를 다시 로딩한다.
autoload run-help

# 이제 run-help 로 builtin command 설명서를 볼 수 있다.
run-help cd


#####


# man page 나 --help 로 보이는 문서는 자세하지만 길고,
# 예시도 없어 차근차근 읽어 이해하는데 시간이 걸리는데 
# tldr(too long dont' read)을 사용하면 실제 사용 예시등으로 빨리 파악할 수 있다.

# 설치
npm install -g tldr

# mac 에선 brew 로도 설치 할 수 있다.
brew install tldr

# ls 사용방법 보기
tldr ls

wsl bash completion is too slow

# wsl(windows subsystem for linux) 의 bash 탭으로 파일 자동 완성을 시도하면 너무 오래걸리는 문제가 있다.
bash ./a탭... 한참 후 파일 자동완성

# 터미널을 하나 더 열어 이전 터미널의 bash 탭 동작의 system call 을 살펴보면
# /mnt/c/windows 경로들의 수많은 파일들을 찾고 있는 것을 볼 수 있다.
strace -p 이전터미널pid

# path 환경변수 설정에 /mnt/c/windows 경로가 포함되어 있는 것이 문제였다.
echo $PATH
/mnt/c/Program Files/Intel/iCLS Client/:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/
...

# path 에서 /mnt/c/windows... 경로들을 빼고 재설정하면 빠르게 자동완성 된다.

# 이 이슈가 등록되어 있고,
# 배포판(ubuntu 등)의 /etc/wsl.conf 파일을 생성하고 다음 옵션값을 설정하면
# /mnt/c/window 등 윈도우 경로들이 추가되지 않는다.
sudo vi /etc/wsl.conf
[interop]
appendWindowsPath=false

# cmd -> wsl 배포판 상태를 확인
C:\Users\Administrator>wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         2

# 배포판을 terminate 시킨다.
C:\Users\Administrator>wsl -t ubuntu-18.04

# 이제 wsl 배포판(ubuntu)를 다시 시작하면
# path 환경변수에서 윈도우 경로가 빠져있고 bash 자동완성이 빠르게 동작한다.

# appendWindowsPath=false 옵션으로 윈도우 관련 경로들이 제외됐기 때문에
# wsl 에서 vscode 를 code . 실행을 위해선 아래 경로를 추가해야 한다.

centos bash 4.4 설치

# centos 7.7 사용중인데 bash 최신 버전(4.4이상)을 설치하려고
# yum 으로 시도하면 4.2.46 만 설치된다.
sudo yum install bash

# 때문에 소스를 다운로드 받아 빌드 및 설치해본다.
wget https://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz
tar zxvf bash-4.4.tar.gz
cd ./bash-4.4
./configure
make -j4
sudo make install

# 이제 로그아웃 후 다시 로그인해 버전 확인
bash --version
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

couchbase cli 사용하기

# couchbase 설치된 곳에 /opt/couchbase/bin/couchbase-cli 을 사용해
# 다양한 작업을 실행할 수 있다.
# 참고로 아래 예시는 couchbase 6.0 기준 이고 버전에 따라 조금 다를 수 있다.

# administrator 비번 변경
# administrator 는 couchbase 설치시 생성한것(이름은 이때 정함)으로 1개만 있다.
# sudo 를 사용하는 이유는 암호 변경을 위해서는
# 토큰(/opt/couchbase/var/lib/couchbase/localtoken)파일로 인증하는데
# couchbase 사용자,그룹만 권한이 있어서다.
sudo /opt/couchbase/bin/couchbase-cli reset-admin-password --new-password ysoftman

# 서버(노드) 추가
# 노드가 수십개 이상일 경우 어드민툴(:8091)->servers->add server 하기보다
# couchbase-cli 를 이용한 쉘 스크립트를 실행하면 편한다.
for ((i=1;i<=10;i++)); do
target="ysoftman-couchbase-$i"
echo "${target}"
/opt/couchbase/bin/couchbase-cli server-add -c ysoftman-couchbase-1 -u admin -p ysoftman --server-add-username=admin --server-add-password=ysoftman --server-add=${target}
done
/opt/couchbase/bin/couchbase-cli rebalance -c ysoftma-couchbase-1 -u admin -p ysoftman

# 서버 리스트 확인
/opt/couchbase/bin/couchbase-cli server-list -c ysoftman-couchbase-1 -u admin -p ysoftman

vscode 원격 개발

# vscode 1.35 부터 remote develop extension 을 설치해
# ssh, docker container, wsl 의 원격 개발 환경을 이용 할 수 있다.
# 참고로 아이콘도 좀 심플하게(예쁘게) 변경됐다.~ㅎ

# 원격 접속은 원격 서버의 ${HOME}/.vscode-server 프로그램을 설치하고 vscode-server 가 실행돼 원격으로 접속하게 된다.
# vscode-server 는 wget 로 다운로드를 하게 되는데
# 참고로 사내망이라면 http_proxy 환경 변수를 설정 해줘야 한다.

# docker container 가 이미 떠있는 경우
remote-containers : attach to running container
-> 현재 떠있는 컨테이너 선택 -> 새 vscode 창이 오픈

# 새 vscode 가 생성되면 컨테이너의 소스 파일을 열어 볼 수 있고,
# vscode 터미널에서 빌드 커맨드 등을 실행할 수 있는 상태가 된다.

# remote ssh 는 ~/.ssh/config 와 ~/.ssh/authorized_keys 사용한다.
# kerberos 인증 환경에서도 접속할 수 있다.
# settings.json 설정에 다음을 추가하면 로그인 터미널 상태를 표시해준다.
"remote.SSH.showLoginTerminal": true

# 로그인 터미널에 다음과 같은 에러가 발생하는 경우
channel 2: open failed: administratively prohibited: open failed

# 대상 호스트 서버의 /etc/ssh/sshd_config 에 tcp 포워딩 가능하도록 설정한다.
AllowTcpForwarding yes

# 그리고 sshd 서버를 재시작한다.
sudo systemctl restart sshd

# 기타 접속 이슈 해결방법 참고
https://code.visualstudio.com/docs/remote/troubleshooting#_troubleshooting-hanging-or-failing-connections

# remote develop 기능은 vscode live share(로컬 코드를 공유)와 비슷하지만
# 원격 장비의 코드를 vscode 로 볼 수 있어 좋은것 같다.

git sub(custom)command 사용하기

t-명령이름 으로 실행할 파일을 만들고
vi git-ysoftman
#!/bin/bash
echo "ysoftman's custom git command test"
chmod +x git-ysoftman

# 다음과 같이 명시하면 현재 위치에서는 커스텀 명령이 실행된다.
git ysoftman

# 만약 현재경로에서 git ysoftman 실행시 다음과 같은 에러가 발생하면
git: 'ysoftman' is not a git command.
# GIT_EXEC_PATH 환경변수를 현재디렉토리로 설정해 실행한다.
# https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EB%82%B4%EB%B6%80-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98
GIT_EXEC_PATH=$(pwd) git ysoftman

# 또는
git --exec-path=. br

# 또는
# bash, zsh 등에서 git-subcommand 를 현재 디렉토리에서 실행하기 위해
# PATH 환경변수 처음이나 마지막에 구분자(:)가 있거나
# PATH 중간에 :: 부분이 있어야 한다.
# ./a.sh 대신 a.sh 실행 가능해야 한다.
export PATH=$PATH:

# 또는
export PATH=:$PATH

# 또는
export PATH=/bin::$PATH

# 참고
# 다음 옵션으로 현재 사용중인 command 경로를 알 수 있다.
git --exec-path

# git 명령이 어떻게 수행되는지 trace 해볼 수 있다.
# 2값이상을 주면 open file descriptor 번호로 파악해서 해당 파일로 trace를 기록한다.
GIT_TRACE=2 git ysoftman

golang xxx.a not a package file 에러

윈도우에서 cmd <-> bash(ubuntu) 에서 같은 GOPATH 를 공유하는데
ubuntu 환경에서 go build 시 다음과 같은 에러가 발생할때가 있다.

home/ysoftman/workspace/gopath/pkg/linux_amd64/github.com/mattn/go-runewidth.a: not a package file

이 경우 해당 .a 파일을 삭제 후 패키지를 다시 받아본다.

rm home/ysoftman/workspace/gopath/pkg/linux_amd64/github.com/mattn/go-runewidth.a
go get "github.com/mattn/go-runewidth"

bash 환경에서 명령줄 vi 스타일로 편집하기

# bash(or zsh)에서 명령줄을 vi 스타일로 편집할 수 있다.
# 다음 명령으로 실행하면
set -o vi

# vi 옵션이 활성화(on)된것을 확인할 수 있다.
set -o | grep vi

# 명령줄을 입력하다가 esc 로 명령모드로 전환해 w, b 로 워드단위로 이동할 수 있다.
# a, i 로 입력모드로 돌아 입력할 수 있다.
# v 로 블럭 지정등 기타 vi 편집 기능을 사용할 수 있다.

# vi 옵션을 비활성화(off)하려면
set -o novi

# 참고
http://linuxcommand.org/lc3_man_pages/seth.html

linux , windows 10 bash 터미널 beep 없애기

# linux , windows 10 의 linux bash 터미널을 열어 작업할때,
# backspace 로 글자를 더이상 지울 수 없는 경우 beep 가 발생한다.
# 습관적으로 backspace 를 연타하게 되는데 beep 가 아주 거슬린다.
# terminal beep
# /etc/inputrc 파일을 열어 bell-style none 으로 설정한다.
# 기본적으로 이부분이 주석처리되어 있어 주석해제해주면 된다.
# 파일 저장 후 bash 종료하고 다시 실행하면 beep 가 발생하지 않는다~
sudo vi /etc/inputrc
set bell-style none

# vim beep
# vim 도 똑같이 beep 가 발생하는데 .vimrc 에 visualbell 을 설정하자.
vi ~/.vimrc

# beep 사용하지 않고 t_vb 로 설정된 문자로 bell 을 표시하는데
# t_vb 로 설정된것이 없어 visual bell 도 사용하지 않게 된다.
set visualbell t_vb=

# 참고
https://linuxconfig.org/turn-off-beep-bell-on-linux-terminal

# 추가로 windows 의 wsl + termianl 앱사용시 less beep
# git diff, man ls 등 페이지 처음/끝에서 더 이동하려고 하면 (less 커맨드) beep 가 발생한다.
# echo $LESS 는 다음과 같이 설정되어 있는데
# LESS='-g -i -M -R -S -w -X -z-4'
# -R -Q 를 추가하면 된다.(bashrc 등에 넣어주자.)
export LESS="$LESS -R -Q"


터미널에서 디렉토리 히스토리 및 이동

# shell builtin command 중 dirs (directory stack) 을 사용하면 최근 이동한 디렉토리들을 볼 수 있다.
# 자세한 dirs 설명은 https://www.gnu.org/software/bash/manual/html_node/Directory-Stack-Builtins.html

# zsh 은 DIRSTACKSIZE 으로 설정한 크기만큼 스택을 쌓을 수 있다.
set DIRSTACKSIZE=10

# 다음으로 현재까지 이동했던 디렉토리 목록을 스택형식으로 볼 수 있다.
dirs -v
0 ~/workspace/ysoftman
1 ~/workspace/ysoftman/test1
2 ~/workspace
3 ~

# zsh 에서 다음과 같이 스택내의 번호로 사용해 해당 디렉토리 이동할 수 있다.
# 스택 위에서 3번째 ~ 로 이동
cd +3

# 스택 맨아래에서 뒤로 2번째 ~/workspace 로 이동
cd -2

# 참고로 bash 에서는 DIRSTACKSIZE 을 사용할 수 없고 cd [-/+] 등은 사용할 수 없다.

terminal, terminal-emulator, console, shell 차이

쉘(shell)은 확실히 명령 처리 프로그램으로 구분이 가지만 터미널(terminal), 콘솔(console)이라는 용어는 많이 혼용해서 사용하는 것 같다.
뭐 거의 비슷한 의미를 가지고 있지만 정확히 분류하면 다음과 같다.

터미널 = 텍스트 입출력 환경, tty(teletypewriter, 전기 타자기)라고도불린다. 엄밀히는 부팅시 GUI 로 시작하지 않고 CLI 로 진입한 경우를 터미널이라고 하고 GUI 로 환경에서 창을 띄워 터미널을 사용할 수 있는 것을 터미널 에뮬레이터(emulator) 라고 한다.
콘솔 = 물리적 측면에서의 터미널, (초창기 유닉스 장비의 가구 느낌)
쉘 = 커맨드 실행(인터프리터) 프로그램

참고
https://askubuntu.com/questions/506510/what-is-the-difference-between-terminal-console-shell-and-command-line

위 링크에서 초창기 유닉스 시스템 사진을 보면 큰 기계 장치를 일종의 가구에 비유해 콘솔이라를 이름을 붙인것 같다.

ssh alias 실행 안되는 문제

# ssh 로 호스트에 명령을 실행할때 alias 로 지정된 키워드가 실행 안되는 경우가 있다.
# 일반 쉘 명령은 실행된다.
ssh ysoftman@ysoftman-centos7 "ls"

# 하지만 호스트에 alias 설정된 키워드 실행시 찾을 수 없다는 에러가 발생한다.
ssh ysoftman@ysoftman-centos7 "myls"
bash: myls: command not found

# 이유는 interactive 로 쉘이 실행되지 않으면 alias 를 쓸수 없는 경우로
# ~/.bashrc 에 다음과 같이 쉘 옵션을 설정해줘야 한다.
shopt -s expand_aliases

# 그리고 스크립트에 alias 가 있을때 . a.sh 실행은 되지만
# expand_aliases 가 없으면 bash a.sh 는 echoysoftman command not found 발생한다.
# 참고로 shopt 는 bash built-in 명령으로 zsh 에서는 사용할 수 없는 명령이다.
# alias script example
shopt -s expand_aliases
alias echoysoftman="echo ysoftman"
echoysoftman

Ubuntu unexpected operator 쉘스크립트 에러

# Ubuntu(우분투)에서 쉘 스크립트(.sh)를 실행할때 다음과 같은 오류 메시가가 발생한다.
[: Linux: unexpected operator

# 쉘 스크립트를 실행할때 sh 명령을 사용하는데 보통은 bash 로 링크걸려 있다.
# 그런데 우분투의 경우는 sh -> dash 로 링크가 걸려 있다.
# 다음 명령으로 sh 의 링크 상태를 확인해보자!
ls -ahl /bin/sh

# 해결방법1
# bash 로 쉘 스크립트 실행
bash ysoftman.sh

# 해결방법2
# sh -> bash 로 링크하여 sh 로 실행
sudo unlink /bin/sh
sudo ln -s /bin/bash /bin/sh
sh ysoftman.sh

# dash shell 참고
https://ko.wikipedia.org/wiki/%EC%95%94%ED%82%A4%EC%8A%A4%ED%8A%B8_%EC%85%B8

linux set export env

# set(builtin command) 현재 쉘에만 국한된 환경변수 조회
set

echo '-----'

# ysoftmanvar1=1234 로 저장된 상태
export ysoftmanvar1="1234"
echo $ysoftmanvar1


# env 만 사용하면 zzz 값으로 되지 않는다.
env ysoftmanvar1="zzz" echo $ysoftmanvar1
# ysoftmanvar1=zzz 로 명령 수행하기
ysoftmanvar1="zzz" bash -c 'echo $ysoftmanvar1'


# unexport
unset ysoftmanvar1
unset ysoftmanvar2

# export 는 현재 쉘과 현재 쉘에서 파생된 쉘에 환경변수를 적용한다.
# sh ysoftman.sh 로 실행하면 ysoftman.sh 쉘과 그 자식쉘에만 export 가 반영된다.
# source ysoftman.sh 로 실행해야 현재 쉘에 export 내용이 반영된다.
export ysoftmanvar1='ysoftmanvar1'
export ysoftmanvar2='ysoftmanvar2'

echo '-----'

# export 또는 env 로 export 된 환경변수 조회
env

맥 다수의 파일명 변경하기

# rename 설치(맥의 경우)
# sudo  brew install rename

# 현재 디렉토리내의 모든.txt 확장자 파일을 .log 로 바꾸기(정규 표현식 사용하는 경우)
rename 's/\.txt/\.log/' *.txt

# test 로 시작 하는 모든 디렉토리,파일 test 부분 -> ysoftman 로 바꾸기
rename 's/^test/ysoftman/' *