- Linuxにある
ssh-copy-id
をWindowsでもやりたくなったので、GPT-4に聞きながら関数を作って登録してみました。 - 参考ページでは関数化まではしていなかったので、本記事では関数化して呼び出せるようにしました。
コード
$dir = Split-Path -Path $PROFILE
if (!(Test-Path -Path $dir)) {
New-Item -ItemType Directory -Force -Path $dir
}
if (!(Test-Path -Path $PROFILE)) {
New-Item -Type File -Path $PROFILE -Force
}
Set-ExecutionPolicy Unrestricted -Scope CurrentUser
Add-Content -Path $PROFILE -Value @"
function ssh-copy-id {
param (
[Parameter(Mandatory=`$true, ValueFromRemainingArguments=`$true)]
[string[]]`$HostName
)
`$sshCommand = `"mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys`"
foreach (`$h in `$HostName) {
cat ~/.ssh/id_rsa.pub | ssh `$h `$sshCommand
}
}
"@
. $PROFILE
使い方
ssh-copy-id username@hostname
- 同時に複数のホストへも公開キーを渡せます。
ssh-copy-id 'username1@hostname1' 'username2@hostname2' 'username3@hostname3'
- ポートがデフォルト22番ではない場合、ssh configに記載してから実行してください
config
Host HostName1
HostName hostname1
Port 3000
User username1
IdentityFile ~/.ssh/id_rsa
ssh-copy-id HostName1
軽く解説
PROFILEがない場合は作成する
- PROFILEとは.bash_aliasみたいなもの。
-
$PROFILE
でPROFILEのパスを確認できるが、存在してなくてもパスが出てくるので、表示されたパスをlsで確認してみる。ない場合は以下を実行する。
$dir = Split-Path -Path $PROFILE
if (!(Test-Path -Path $dir)) {
New-Item -ItemType Directory -Force -Path $dir
}
if (!(Test-Path -Path $PROFILE)) {
New-Item -Type File -Path $PROFILE -Force
}
スクリプト実行ポリシーを RemoteSigned
または Unrestricted
に変更する
-
RemoteSigned
は、ローカルコンピュータ上で作成されたスクリプトは実行を許可し、インターネットからダウンロードしたスクリプトはデジタル署名が必要となるポリシー -
Unrestricted
はすべてのスクリプトを実行するポリシー -
以下で権限を確認
- 私の場合、
Restricted
になっていたので、権限を変更しました。
- 私の場合、
Get-ExecutionPolicy
- 権限を
Unrestricted
に変更
Set-ExecutionPolicy Unrestricted -Scope CurrentUser
ssh-copy-id
という関数をPROFILEに登録する
Add-Content -Path $PROFILE -Value @"
function ssh-copy-id {
param (
[Parameter(Mandatory=`$true, ValueFromRemainingArguments=`$true)]
[string[]]`$HostName
)
`$sshCommand = `"mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys`"
foreach (`$h in `$HostName) {
cat ~/.ssh/id_rsa.pub | ssh `$h `$sshCommand
}
}
"@
PROFILEを再読み込みする
. $PROFILE
参考