19
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PowerShellでSSH Client SFTP

Last updated at Posted at 2015-10-20

PowerShellでSFTPがやりたくなりました。
会社の都合でClientはWindowsですが、サーバーはLinuxを使っています。
LinuxのサーバーにデータをuploadするにはFTPというレガシー規格はもう古く、
SSH Serverを立ててSFTPで転送するのが流行っております。

え! Git?
アー、聞こえない。

PowerShellでSFTP転送できないものかと調べてみました。

##Posh-SSH
Posh-SSHという素敵なツールを発見しました。

  • BSD 3-Clause License
  • PowerShell3.0以降

インストールもChocolateyのようにスクリプトを実行するだけでインストールできます。

###インストール
管理者権限でPowerShellコンソールを立ち上げて下記のコマンドを実行しましょう。

PoshSSH_Install
PS > iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")

Get-PoshSSHModVersion等のFunctionやCmdlet一覧が表示されればインストール成功です。

もしインストールが失敗するのなら、
下記のコマンドを実行した後にもうインストールすると成功するかもしれません。

Set-ExecutionPolicy
PS > Set-ExecutionPolicy RemoteSigned

###接続
最初に接続すると IPアドレスと認証キーをHKEY_CURRENT_USER\Software\PoshSSH のレジストリキーに登録します。

接続
PS > PS C:\Users\yusuke> New-SSHSession -ComputerName 172.20.0.225 -Credential (Get-Credential portal)
Server SSH Fingerprint
Do you want to trust the fingerprint 5e:cc:94:60:90:4e:9e:9b:38:7b:97:e8:9b:84:2:b4
[] Y  [] N  [?] Help (default is "N"): Y

SessionId  Host           Connected
---------  ----           ---------
    0      172.20.0.225   True
登録されているホストの表示

PS > Get-SSHTrustedHost | Format-List

SSHHost     : 172.20.0.225
Fingerprint : 5e:cc:94:60:90:4e:9e:9b:38:7b:97:e8:9b:84:2:b4
接続されているセッションの表示
PS > Get-SSHSession | Format-List

Connected : True
SessionId : 0
Host      : 172.20.0.225
Session   : Renci.SshNet.SshClient

切断
PS > Remove-SSHSession -SessionId 0 -Verbose
詳細: Removing session 0
True
詳細: Session 0 Removed

###コマンド実行

Linuxのコマンドを実行
PS > Invoke-SSHCommand -SessionId 0 -Command "uname -a"

Host       : 172.20.0.225
Output     : {Linux pxeserver 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+deb7u3 x86_64 GNU/Linux}
ExitStatus : 0

なんとSSHでコマンドが実行できるようです。
Terminal立ち上げるでは面倒だけどPowershell上でLinuxを弄りたいときに重宝するかもしれません。

SSHShellStreamを使ってコマンドを実行
PS > $SSHStream=New-SSHShellStream -SessionId 0
PS > $SSHStream.WriteLine("uname -a")
PS > $SSHStream.read()
Last login: Tue Sep  8 13:37:08 2015 from kyopcd07.local
portal@pxeserver:~$ uname -a
Linux pxeserver 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+deb7u3 x86_64 GNU/Linux
portal@pxeserver:~$

###SCPコマンドを使ってUploadとDownload

SCPでUpload
PS > Set-SCPFile -LocalFile .\SetIP.ps1 -RemotePath /home/portal -ComputerName 172.20.0.225 -Credential (Get-Credential portal)

SCPでDownload

PS > Get-SCPFile -LocalFile C:\Users\yusuke\psfiles\SetIP.ps1 -RemoteFile /home/portal/SetIP.ps1 -ComputerName 172.20.0.225 -Credential (Get-Credential portal)

Get-SCPFolderやSet-SCPFolderを使ってフォルダ毎のアップロード、ダウンロードもできます。

###SFTPを使う

接続
PS > New-SFTPSession -ComputerName 172.20.0.225 -Credential (Get-Credential portal)

SessionId  Host            Connected                                            
---------  ----            ---------                                            
    0      172.20.0.225    True  

接続されているセッションの確認
PS > Get-SFTPSession | Format-List

Connected : True
SessionId : 0
Host      : 172.20.0.225
Session   : Renci.SshNet.SftpClient

行数が多いのでSelect-ObjectでFullNameだけを抽出しております。

カレントディレクトリのファイル一覧
S > Get-SFTPChildItem -SessionId 0 | Select-Object FullName

FullName
--------
/home/portal/.bash_logout
/home/portal/.cpanm
/home/portal/perlentrance
/home/portal/.bash_history
/home/portal/.plenv
/home/portal/.profile
/home/portal/.bash_profile
/home/portal/example.txt
/home/portal/.bashrc
/home/portal/..
/home/portal/.
/home/portal/public_html
/home/portal/SetIP.ps1

フォルダ指定でファイル一覧
PS > Get-SFTPChildItem -SessionId 0 -Path /home/portal/public_html/ps1


FullName       : /home/portal/public_html/ps1/ip
LastAccessTime : 2015/10/20 11:39:19
LastWriteTime  : 2015/10/20 9:28:06
Length         : 4096
UserId         : 1001

FullName       : /home/portal/public_html/ps1/anothersoftware.ps1
LastAccessTime : 2015/05/22 16:27:11
LastWriteTime  : 2015/05/22 17:01:41
Length         : 1597
UserId         : 1001

FullName       : /home/portal/public_html/ps1/..
LastAccessTime : 2015/10/20 12:01:34
LastWriteTime  : 2015/10/19 16:58:42
Length         : 4096
UserId         : 1001

FullName       : /home/portal/public_html/ps1/.
LastAccessTime : 2015/10/20 12:03:05
LastWriteTime  : 2015/10/20 12:02:46
Length         : 4096
UserId         : 1001

FullName       : /home/portal/public_html/ps1/inifile
LastAccessTime : 2015/10/16 10:33:45
LastWriteTime  : 2015/05/22 16:27:28
Length         : 4096
UserId         : 1001

他にも以下のコマンドがあります。

  • Get-SFTPItem SFTPで特定のファイルをダウンロード
  • Rename-SFTPFile SFTPを使ってリモートのファイルのリネーム
  • Remove-SFTPItem SFTPを使ってリモートの特定のファイルやフォルダを削除
  • Set-SFTPFile 特定のファイルをSFTPを使ってupload

##最後に
Posh-SSHをインストールすれば、SSHが使える。
本格的な作業には向かないが、
ちょっとSSHでLinuxにコマンドを実行するとか、
ファイルをPowerShellでバンバンアップロードするといった作業に重宝しそうである。

##参考文献
Posh-SSH: Open Source SSH PowerShell Module
Posh-SSH GitHub

19
21
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?