2013-03-21 30 views
7
# Write the SSH-KEY to the disk 
    fs.writeFile "/cgrepos/.ssh/#{repo.id}.pub", repo.public_key, (err) -> 
    throw err if err 

    fs.writeFile "/cgrepos/.ssh/#{repo.id}", repo.private_key, (err) -> 
     throw err if err 

     exec "chmod 400 /cgrepos/.ssh/#{repo.id} && eval `ssh-agent -s` && ssh-add /cgrepos/.ssh/#{repo.id}", (error) -> 
     throw error if error 
     # First, delete the git repo on the hard drive, if it exists 
     exec "rm -rf #{git_location}", options, (error) -> 
      throw error if error 
      # Second, clone the repo into the location 
      console.log "Cloning repo #{repo.id}: #{repo.repo_name} into #{git_location}. This could take a minute" 
      exec "git clone #{repo.url} #{git_location}", options, (error) -> 
      throw error if error 

Tôi đang cố gắng trong nút (sử dụng coffee cho những người tuyệt vời). Nhưng vì lý do nào đó, khi nó chạy, nó cho tôi một lỗi: Error: Command failed: conq: repository access denied. deployment key is not associated with the requested repository.Không thể git clone bằng cách thêm ssh-key vào Node.js

Không chắc mình đang làm gì sai. Nếu tôi chạy các lệnh đó từ dòng lệnh trực tiếp, mọi thứ có vẻ hoạt động tốt. Ý tưởng nào?

+0

Bạn đã thử sao chép trực tiếp điều này bằng 'ssh', lấy git ra khỏi phương trình? Mặc dù bạn không thể nhận được bất kỳ thứ gì hữu ích từ máy chủ của Bitbucket (từ thông báo lỗi tôi cho rằng đó là những gì bạn đang sử dụng), bạn sẽ thấy "Bạn có thể sử dụng git hoặc hg để kết nối với Bitbucket. Truy cập trình bao bị vô hiệu hóa". nếu nó hoạt động; bạn có thể thử 'ssh -v' để gỡ lỗi nếu nó không hoạt động. –

+0

Một điều khác bạn có thể thử là tạo một kịch bản lệnh shell bao bọc để chạy 'exec ssh -v" $ @ "' và đặt biến môi trường 'GIT_SSH' để git sẽ chạy SSH ở chế độ tiết. Sau đó, bạn có thể thấy cách 'git' đang chạy SSH và có thể cung cấp cho bạn một số manh mối. –

Trả lời

4

Khi bạn cố thực hiện quy trình git clone từ node.js, nó chạy trong môi trường khác nhau.

Khi bạn sử dụng git clone trên kho lưu trữ được bảo vệ (trên giao thức ssh), ssh-agent trước tiên sẽ cố gắng xác thực bạn bằng khóa công cộng được cung cấp. Vì exec sử dụng môi trường thời gian chạy khác nhau cho mỗi cuộc gọi, ngay cả khi bạn đang thêm khóa riêng của mình một cách rõ ràng, nó sẽ không hoạt động vì môi trường thời gian chạy khác nhau.

Khi xác thực trong ssh, git clone tìm kiếm SSH_AUTH_SOCK. Nói chung biến env này có đường dẫn của dịch vụ khóa mật khẩu của bạn như (gnome-keyring hoặc kde-wallet).

Hãy thử điều này để kiểm tra trước.

env | grep -i ssh 

Cần liệt kê SSH_AGENT_PID và SSH_AUTH_SOCK. Vấn đề là khi chạy git clone các biến môi trường này không được đặt. Vì vậy, bạn có thể đặt chúng (chỉ cần SSH_AUTH_SOCK là đủ) như các tùy chọn trong cuộc gọi hàm exec. Hãy xem here về cách chuyển các cặp khóa env sang exec.

var exec = require('child_process').exec, 
    child; 

child = exec('git clone cloneurl', { 
    cwd: cwdhere,  // working dir path for git clone 
    env: { 
      envVar1: envVarValue1, 
      SSH_AUTH_SOCK: socketPathHere 
     } 
}, callback); 

Nếu cách này không hiệu quả, hãy thử thực thi ssh -vvv [email protected] trong chức năng exec. Xem đầu ra của quá trình này, bạn sẽ tìm thấy lỗi.

Nếu lỗi nói debug1: No more authentication methods to try. Permission denied (publickey)., sau đó thêm bí danh máy chủ lưu trữ vào $ HOME/.ssh/config tệp như thế này.

Host hostalias 
Hostname git-repo-host 
IdentityFile ~/.ssh/your_private_key_path 

Điều này sẽ sử dụng khóa riêng tư cho tất cả yêu cầu xác thực đối với máy chủ được chỉ định. Trong tùy chọn này, bạn cũng có thể thay đổi địa chỉ origin's của mình để sử dụng các hostalias được định cấu hình trong tệp ở trên. reporoot/.git/config tệp sẽ trông như thế này.

[remote "origin"] 
    url = [email protected]:repo.git 
+0

Tôi đang cố gắng làm điều này một cách có lập trình cho hàng nghìn repos mà tôi không sở hữu hoặc kiểm soát. Tôi tạo khóa 'ssh' và người dùng của chúng tôi sẽ thêm chúng vào khóa triển khai của họ. Vì vậy, tôi không chắc chắn nếu điều này sẽ làm việc – Shamoon

+0

Trong trường hợp đó, cách hostalias không được áp dụng. Nhưng bạn nên cố gắng thiết lập môi trường thích hợp cho quá trình đó. – smitrp

Các vấn đề liên quan