Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Create SSH Manager with Go
Search
syossan27
April 18, 2018
1.3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Create SSH Manager with Go
This slide for Go(Un)Conference #1
https://gounconference.connpass.com/event/83112
syossan27
April 18, 2018
More Decks by syossan27
See All by syossan27
一人でちいさくはじめる Platform Engineering
syossan27
4
2.7k
一人SREが歩んだPlatform Engineeringスモールスタート実践録 ~ クラウドネイティブ会議版 ~
syossan27
4
2.2k
プロポーザル サポートガイドを読み解いていこう!
syossan27
3
960
幻滅期を越える サイトリライアビリティ エンジニアリング
syossan27
1
260
一人SREが歩んだ Platform Engineering スモールスタート実践録
syossan27
2
1.9k
SREって何? 現場で学んだサイト信頼性の第一歩
syossan27
5
1.7k
知識0からカンファレンスやってみたらこうなった!
syossan27
5
770
突然のメモリ使用率上昇へ対応! k8sカスタムコントローラー開発事例
syossan27
2
580
監視 やばい
syossan27
12
11k
Featured
See All Featured
First, design no harm
axbom
PRO
2
1.3k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
340
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
300
Deep Space Network (abreviated)
tonyrice
0
270
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
580
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
500
Rails Girls Zürich Keynote
gr2m
96
14k
Practical Orchestrator
shlominoach
191
12k
Code Reviewing Like a Champion
maltzj
528
40k
Transcript
$SFBUF44).BOBHFS XJUI(P Shota Inoue Go (Un) Conference #1
I’m Shota Inoue (@syossan27) Golang Beginner ʕ ◔ϖ◔ʔ <
Write simple code !
None
None
Create this
Why? ɾOn business ɾCreate SSH Client with Go is simple!
Feature ɾManage ssh connection informations ɾConnect using by connection information
ɾCrypt for connection information by AES key ɾBash completion
Search Github… Only this! But…
Implement ssh client Use this package. golang.org/x/crypto/ssh golang.org/x/crypto/ssh/terminal
1 client, err := ssh.Dial("tcp", "
[email protected]
") 2 session, err :=
client.NewSession() 3 fd := int(os.Stdin.Fd() 4 oldState, err := terminal.MakeRaw(fd)) 5 session.Stdout = os.Stdout 6 session.Stderr = os.Stderr 7 session.Stdin = os.Stdin 8 modes := ssh.TerminalModes{ 9 ssh.ECHO: 1, 10 ssh.TTY_OP_ISPEED: 14400, 11 ssh.TTY_OP_OSPEED: 14400, 12 } 13 err = session.RequestPty("xterm-256color", h, w, modes) 14 err = session.Shell() 15 err = session.Wait() Can implement by 15 line !
! Important processing 3 fd := int(os.Stdin.Fd() 4 oldState, err
:= terminal.MakeRaw(fd)) Important to exec ssh terminal in raw mode. If execute ssh terminal in cooked mode, buffering input. Therefore not work editor etc...
None
Manage connection informations 1. Input connection information 2. Crypt for
using by AES key (ex. ~/.ssh/id_rsa) 3. Write to file
Another way… Use boltdb for store connection informations. but…
Bash completion Put bash_completion file by manual operation is easily,
but it is not cool ! Therefore…
1 completionFileContent := ` 2 _cli_bash_autocomplete() { 3 local cur
opts base 4 COMPREPLY=() 5 cur="${COMP_WORDS[COMP_CWORD]}" 6 opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash- completion ) 7 COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) 8 return 0 9 } 10 complete -F _cli_bash_autocomplete en 11 ` 12 13 f, err := os.Create(completionFile) 14 _, err = f.Write([]byte(completionFileContent)) 15 16 loadConfigFileContent := "if [ -f '/etc/bash_completion.d/en' ]; then source '/etc/bash_completion.d/en'; fi” 17 18 f, err := os.OpenFile(“~/.bashrc”, os.O_APPEND|os.O_WRONLY, 0600) 19 fmt.Fprintln(f, loadConfigFileContent)
ʕ ◔ϖ◔ʔ < Go is God Fin.