transfer.put() docs ์ ๋ฐ๋ฅด๋ฉด ํ์ผ์ ๋ํ ๋ก์ปฌ ๊ฒฝ๋ก(๋ฌธ์์ด) ๋๋ ํ์ผ๋ฅ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ ์ ์์ด์ผ ํฉ๋๋ค.
์ ์(๋ฌธ์์ด)๋ฅผ ์ฌ์ฉํ ๋ remote
๊ฒฝ๋ก์ ๋์ ๋๋ ํ ๋ฆฌ๋ง ์ง์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ผ๋ถ ์ ์์ ์ฌ์ฉ๋ฉ๋๋ค.
c.put('myfiles.tgz', '/opt/mydata')
๊ทธ๋ฌ๋ ๋์ผํ ์์
์ ์ํํ๋ ค๊ณ ํ ๋( c.put('file.txt', '/home/me/dir')
, ์ค์ ๋ก local
๊ฒฝ๋ก๊ฐ ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด์ธ ๊ฒ์ฒ๋ผ ์๋ํ๊ธฐ ๋๋ฌธ์ ํญ์ IOError: Failure
๋๋ฉ๋๋ค. ๋ฌธ์์ด์ด ์๋๋๋ค.
ํนํ paramiko.transport.sftp.sftp._log: [chan 0] open('/home/me/dir', 'wb')
์์ ์คํจํฉ๋๋ค.
์๋ฃจ์ ์ ํญ์ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
c.put('file.txt', '/home/me/dir/file.txt')
๊ทธ๋ฌ๋ ์ด๋ ๋ฌธ์ ๋ฐ ์์ ์ ์ผ์นํ์ง ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก $HOME
๋ํ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ์ด์์ ์ด์ง ์์ง๋ง ์ด๋ฏธ #1653์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น? Connection.put
remote
๋ฅผ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก ๋ฌธ์์ด๋ก ์ฌ์ฉํ๋ฉด ํ์ฌ IOError
ํฉ๋๋ค.
(๋ํ Fabric et al์ ๋ํ ๋ชจ๋ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!)
ํจ๋ธ๋ฆญ 2.1.3
ํ๋ผ๋ฏธ์ฝ 2.4.1
1.0.0 ํธ์ถ
ํฉ๋ฒ์ ์ธ ๋ฒ๊ทธ์ฒ๋ผ ๋ค๋ฆฌ๋ ๋์ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํจ์น(๋ฐ ํ ์คํธ! ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ํต๊ณผํ๊ธฐ ๋๋ฌธ์:(์ฐ๋ฆฌ๊ฐ ์ผ๋ถ๊ฐ ๋๋ฝ๋์์์ ์์ํ๋...)๋ฅผ ํ์ํฉ๋๋ค.
์ง๊ธ ์ด๊ฒ์ ๋ณด๋ฉด ์ค์ ๋ก ๋ฌธ์ ๊ฐ FLO์ ๊ฐ์ ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ๋์ ์ฌ๋ฐ๋ฅธ ์๊ฒฉ ๊ฒฝ๋ก ๋ญ์น๋ฅผ ๊ตฌํํ์ง ๋ชปํ ๊ฒ๋ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, SFTP ์๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋๋ ํ ๋ฆฌ๋ฅผ ์ด๋๋ก ์์ฒญํ๋ ๊ฒ์ ๋๋ค. ๋ก์ปฌ ํ์ผ์ ๊ธฐ๋ณธ ์ด๋ฆ์ ์๊ฒฉ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก์ ๋ถ์ด๋ ๋์ ์ธ ํ์ผ์ ๋๋ค.
Fabric ์ธก์ ๋ถ๋ถ ๋๋ฒ๊ทธ ๋ก๊ทธ:
invoke.transfer.put: Massaged relative local path 'setup.py' into '/Users/jforcier/Code/oss/fabric/setup.py'
invoke.transfer.put: Uploading '/Users/jforcier/Code/oss/fabric/setup.py' to '/Users/jforcier/tmp/'
paramiko.transport.sftp.sftp._log: [chan 2] open(b'/Users/jforcier/tmp/', 'wb')
๊ทธ๋ฐ ๋ค์ traceback์ ์ผ๋ถ๋ sftp_client.py
์์ ํด๋น ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ CMD_OPEN์ ๋์ง๊ณ ์์์ ๋ณด์ฌ์ค๋๋ค.
t, msg = self._request(CMD_OPEN, filename, imode, attrblock)
๊ฒฐ๊ตญ SFTP ์๋ฒ๊ฐ IO ์์ ์ ์๋ชป๋์๋ค๊ณ ๋งํ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋์ผํ ํ์ผ/ํด๋์ค์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋๋ฌํฉ๋๋ค(์ด๊ฒ์ด OpenSSH์ ๊ฒฐํจ์ธ AFAIK์ด๊ธฐ ๋๋ฌธ์ "์คํจ"์ธ ์ด์ ์ ๋๋ค.)
์ด์จ๋ , ์ด๊ฒ์ ์ฆ๋ช ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์์ฑํ ๋ค์ ๊ทธ๊ฒ์ด ๋ ผ๋ฆฌ์ธ์ง ์์๋ผ ์๊ฐ์ ๋๋ค. (๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ ์์ ์์ ์ถ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค) ๋๋ ์ค์ ๋ก ๋๋ฝ๋ ๊ธฐ๋ฅ ๋ถ๋ถ์ ๋๋ค.
์ข์, ์๋, ๋ชจ๋ munging์ ๋น์ด ์๊ฑฐ๋ ์๋์ ์ธ ์๊ฒฉ ๊ฒฝ๋ก ์ฃผ๋ณ์ ์์ผ๋ฉฐ is-directory ๊ฒ์ฌ๋ ์์ต๋๋ค.
์ฌ๊ธฐ ์๋ ๋์ ์๊ฒฉ ๊ฒฝ๋ก๊ฐ ๋๋ ํ ๋ฆฌ์ธ ๊ฒฝ์ฐ FLO๋ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ๊ถ๊ธํฉ๋๋ค.
v1์์ FLO์ .name
์์ฑ ์ Python FLO API ์
์ด์จ๋ , ์ฌ๊ธฐ v2์์ ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์ ๋ฅผ ์ค์ ๋ก ํด๊ฒฐํ ์ ์๋ ๊ธฐํ๊ฐ ์์ต๋๋ค. ๋๋ "์ด๋ด, ์ด๊ฒ๋ค์ ๋ํด ๋๋ ํ ๋ฆฌ๊ฐ ์๋ ์๊ฒฉ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค"๋ผ๋ ๋ช ์์ ์ธ ์์ธ๋ฅผ ๋์ง ์ ์์ต๋๋ค. ์ด์จ๋ ๋ชจ๋ FLO์ ๋ฐ๋์ name ์์ฑ์ด ์๋ ๊ฒ์ ์๋๋ฏ๋ก ๋ ๋ค์ผ ๊ฒ์ ๋๋ค.
์, ๋ชจ๋ ์์ ๋์์ต๋๋ค. ๋ค์ bugfix ๋ฆด๋ฆฌ์ค์์ ๊ณต๊ฐ๋ฉ๋๋ค ๐